Java 易失性对象工作
考虑下面的场景,它说如果Java 易失性对象工作,java,multithreading,volatile,Java,Multithreading,Volatile,考虑下面的场景,它说如果str是易变的,这意味着任何访问str的线程的任何更新都将直接在主堆栈上更新,而不是在本地线程缓存上更新 class A{ volatile String str; volatile B b=new B(); } class B{ int a; C c; } 对于bvolatile对象,场景将如何工作 我读了一些链接,它说只有引用是易变的,而不是对象本身的属性,这意味着什么,有人可以帮我举一些例子,因为我发现它有点难以理解 如果引用是同步的,
str
是易变的,这意味着任何访问str
的线程的任何更新都将直接在主堆栈上更新,而不是在本地线程缓存上更新
class A{
volatile String str;
volatile B b=new B();
}
class B{
int a;
C c;
}
对于b
volatile对象,场景将如何工作
我读了一些链接,它说只有引用是易变的,而不是对象本身的属性,这意味着什么,有人可以帮我举一些例子,因为我发现它有点难以理解
如果引用是同步的,那么它将有什么帮助,它的用途是什么?第一种情况:
- 线程1不执行
a.b=new b()代码>
- 然后线程2执行
bb=a.B代码>
b
引用的对象是第一个线程分配给变量的new b()
第二种情况:
- 线程1执行
a.b.setFoo(“hello”)代码>
- 然后线程2执行
字符串s=a.b.getFoo()代码>
在这种情况下,您无法保证第二个线程中
s
的值。它可以是“hello”,也可以是a.b.foo
(除非类b中的foo
属性本身是可变的,或者setter和getter是同步的)。如果线程1
重新分配b
ref,线程2可以读取foo
的最新值吗?e、 g.线程1
:{a.b.setFoo(“你好”);a.b=a.b;}
然后线程2
:{a.b.getFoo();}
对此的评论讨论了相同的观点,但不清楚(对我来说:)