2014-02-14 45 views
0

考虑下面的情况,它说如果str是易失性的,它意味着任何访问str的线程的任何更新都将直接在主堆栈上而不是本地线程缓存上更新。挥发性物体工作

class A{ 
    volatile String str;  
    volatile B b=new B(); 
} 

class B{ 
    int a; 
    C c; 
} 

对于b易失性对象,场景如何工作?

我读了很少的链接说只有引用是易失性的,而不是对象本身的属性,这是什么意思,有人能帮我一些例子,因为我觉得有点难以理解。

如果引用是同步的,那么它将如何帮助,它有什么用处呢?

回答

1

第一种方案:

  • 线程1做a.b = new B();
  • 那么线程2确实B b = a.b;

在这种情况下,你必须保证通过b在第二线程中引用的对象是第一个线程已分配给该变量的new B()

第二种情况:

  • 线程1做a.b.setFoo("hello");
  • 那么线程2确实String s = a.b.getFoo();

在这种情况下,你有关于s在第二个线程的值没有保证。它可能是“hello”,或者它可能是以前的值a.b.foo(除非B类中的foo属性本身是易失性的,或者setters和getters是同步的)。

+0

如果'thread 1'重新赋值'b' ref,'thread 2'是否可以读取'foo'的最新值?例如'thread 1':'{a.b.setFoo(“Hello”); a.b = a.b; }'then'thread 2':'{a.b.getFoo(); }' –

+0

对此[answer](https://stackoverflow.com/a/4614433/1812434)的评论讨论同样的一点,但不清楚(对我:)) –