2013-06-03 44 views
5

假設所有屬性都不是longdouble,是否讀取volatile引用對象保證原子讀取其屬性的最新值?讀取對象的易失性引用是否保證原子讀取其屬性的最新值?

下面是一個具體的例子。

public class Foo { 
    private int bar; 

    public int getBar() { 
     return this.bar; 
    } 

    public void setBar(int bar) { 
     this.bar = bar; 
    } 
} 

public class Baz { 
    private volatile Foo foo; 
} 

線程A可以寫信給FooBar財產的任何時間。線程B只能讀取FooBar屬性。如果線程B通過Baz訪問Bar屬性,它是否會讀取最新值Bar

+3

不變性會讓你的生活在這裏變得更容易。 – SLaks

回答

8

總之沒有。 volatile關鍵字僅適用於foo引用,而不適用於底層對象的字段。

因此,您需要將bar標記爲volatile以達到您描述的結果。

4

好問題,但答案是沒有。 volatile變量的讀取與上一次寫入同步。

所以,一個非空baz確保至少foo.bar第一值但不排除任何連續寫入。當然如果foo.bar是寫在baz之前