當一個線程讀取volatile變量,它看到不僅僅是最新的變化揮發,而且代碼的副作用,導致了變化volatile變量的解釋
這在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提及
有人可以請提供一個這樣的例子嗎?
這首先給我的印象是,讀取volatile變量的線程將與writer線程同步並等待寫入完成。但事實並非如此。
一個例子會有很大的幫助,值得讚賞。
感謝, 穆斯塔法
當一個線程讀取volatile變量,它看到不僅僅是最新的變化揮發,而且代碼的副作用,導致了變化volatile變量的解釋
這在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提及
有人可以請提供一個這樣的例子嗎?
這首先給我的印象是,讀取volatile變量的線程將與writer線程同步並等待寫入完成。但事實並非如此。
一個例子會有很大的幫助,值得讚賞。
感謝, 穆斯塔法
比方說,你有下面的類:
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的新值的線程看到。
謝謝。聲明現在更有意義。現在,我的目的已經達到。 Mush表示讚賞。 – Mustafa
易失字段* 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