考慮下面的Java代碼:!不同!易變的變量?
volatile boolean v1 = false;
volatile boolean v2 = false;
//Thread A
v1 = true;
if (v2)
System.out.println("v2 was true");
//Thread B
v2 = true;
if (v1)
System.out.println("v1 was true");
如果有揮發性訪問全局可見總訂貨則至少有一個的println總是到達。
這實際上是由Java標準保證的嗎?或者是這樣的可能執行:
A: v1 = true;
B: v2 = true;
A: read v2 = false;
B: read v1 = false;
A: v2 = true becomes visible (after the if)
B: v1 = true becomes visible (after the if)
我只能找到報表有關訪問的標準相同 volatile變量(但我可能失去了一些東西)。
「寫入易失性變量(§8.3.1.4)v與任何線程(隨後根據同步順序定義的內容)隨後對v的所有後續讀取進行同步。」
http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4.4
謝謝!
是的,它的確如此。這個問題是http://stackoverflow.com/questions/2441279/java-volatile-guarantees-and-out-of-order-execution的副本 – 2010-03-31 18:33:47