這個問題是來自什麼可以強制刷新非易失性變量?
啓發藉此JVM
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
和下面的代碼
public class Driver implements Runnable {
public static void main(String args[]) throws Exception {
Driver driver = new Driver();
Thread thread = new Thread(driver);
thread.start();
Thread.sleep(100); // make sure threads are unsynced
driver.stop = true;
}
boolean stop = false; // not volatile
@Override
public void run() {
// Loop until stop is set to true.
while (!stop) {
doSomething(stop);
// System.out.println("random string");
}
System.out.println("done");
}
public static void doSomething(boolean value) {
/*ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
out.write(new byte[] {1});
} catch (IOException e) {
e.printStackTrace();
}*/
}
}
當我運行的代碼中,thread
線程永遠不會看到stop
的值爲true
,因此永遠不會退出while
循環(最終它可能會,但在短期內它不會)。
注意在這個呼叫
doSomething(stop);
在字節代碼中使用的stop
,這相當於其在while
循環使用,即。有一個字節碼指令
11: getfield #14 // Field stop:Z
所以我不明白爲什麼這應該有任何效果。
現在,如果你取消第
// System.out.println("random string");
一個或內doSomething(boolean)
的代碼,然後將代碼執行約100毫秒(該Thread.sleep()
的時間),然後自然結束,即得。 stop
的值同步。
我不知道解釋這種行爲。似乎使用OutputStream
會影響線程刷新其字段值的視圖的方式和時間。這是可能的還是我錯過了什麼?
什麼可以強制刷新非易失性變量值的線程視圖?
這個問題的一個單詞的答案是「什麼」。您從未保證不會看到更新。所以*任何*都可以讓你看到一個。 –