具體作用就不多講了,大概就是保證可見性和防止重排序。 其實很早前就知道有這個關鍵字,試過很多次,總覺得加了和沒加效果一樣。
這次終於在閱讀《java並發程序實踐》(順便義務廣告一下,好書)的時候有了靈感,寫了一段很普通的代碼:
Java代碼
public class NoVisibility {
private boolean ready=false;
int num;
private class ReaderThread extends Thread {
public void run() {
int count = 0;
while (!ready)
{
count++;
}
System.out.println(num);
}
}
public static void main(String[] args) throws InterruptedException {
NoVisibility x = new NoVisibility();
x.new ReaderThread().start();
x.num = 43;
x.ready = true;
System.out.println("main Thread end");
}
}
再寫一段python來不停地調用它(因為不一定總能出現),不久後就會發現不返回了,ready值的更新一直對ReaderThread線程不可見。如果ready加個volatile就不會有問題了,可以一直運行。
Python代碼
import os
i=0
while True:
os.system("java -server NoVisibility")#or os.popen
i+=1
print "run count"+str(i)
感受:
1.java運行時加參數-server用server版的虛擬機出問題幾率很高,據說是server才經過大量優化。
2.while (!ready)的循環內如果有System.out操作時,也幾乎不出問題,提高了可見性?(這個是我的猜測)