2013-11-02 46 views
5

當一個線程讀取volatile變量,它看到不僅僅是最新的變化揮發,而且代碼的副作用,導致了變化volatile變量的解釋

這在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提及

有人可以請提供一個這樣的例子嗎?

這首先給我的印象是,讀取volatile變量的線程將與writer線程同步並等待寫入完成。但事實並非如此。

一個例子會有很大的幫助,值得讚賞。

感謝, 穆斯塔法

+0

易失字段* do *建立[同步順序](http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.4):「A寫入一個易失性變量v(§8.3.1.4)與任何線程的後續v讀取進行同步(其中「後續」是根據同步順序定義的)。但是,這*並不意味着在任意讀取之前發生任意寫入(該順序被確定爲寫入的結果*)。 – user2864740

回答

7

比方說,你有下面的類:

public class Shared { 
    public int a; 
    public int b; 
    public volatile int c; 
} 

現在,讓我們說,線程A擁有這個類的一個實例的引用,確實

shared.a = 1; 
shared.b = 2; 
shared.c = 3; 

我們假設線程B有一個對同一個實例的引用,並且

display(c); 
display(b); 
display(a); 

然後,如果針對c顯示的值是3(即,如果線程A的寫入發生在線程B的讀取之前),那麼Java存儲器模型保證2和1也分別顯示爲b和a,這是因爲線程A的所有動作都是先前到寫入volatile的c被保證可以被讀取c的新值的線程看到。

+0

謝謝。聲明現在更有意義。現在,我的目的已經達到。 Mush表示讚賞。 – Mustafa