的Java併發教程忽略原子聲明指出:沒有volatile關鍵字
讀取和寫入原子參考變量和最原始的變量(所有類型除了長和雙)。
對於聲明爲volatile的所有變量(包括長變量和雙變量),讀取和寫入是原子的。
我創建了一個簡單的實驗來測試這個
package experiment0;
public class Experiment0 {
public static int i=9;
public static void main(String[] args) {
i=9;
(new Thread(){
public void run(){
while(i==9){
//System.out.println("i==9");
}
System.out.println("\ni!=9");
}
}).start();
(new Thread(){
public void run(){
try{
Thread.sleep(3000);
i=8;
}catch(Exception e){
}
}
}).start();
}
}
當我運行這段代碼的程序永遠不會被終止!爲了使其工作,我必須在第一個線程的while循環內取消註釋行,或者將i
聲明爲volatile
。 我錯過了什麼嗎?文件是否錯誤,是否應該說在這種情況下所有原始圖像都應該被宣佈爲揮發性物質?爲什麼寫一個System.out
「解決」這個問題?它是否給第二條線足夠的時間來改變i
?
在我的情況下,兩者都能正常工作。 –
您引用的手冊部分和您的代碼存在的問題並沒有真正相關。 「原子」寫入並不意味着另一個線程會看到這些更改。你可以做的更詳細的探索之一是看看編譯器是否優化了讀取,這就是爲什麼你沒有看到更新。 – Jochen
原子意味着更新是不可分割的。你永遠不會看到中間狀態,只有舊的或新的價值。如果你只看到舊的價值,它仍然是原子的。 –