2014-02-14 72 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)的評論討論同樣的一點,但不清楚(對我:)) –