如題所示,本次主要驗證volatile關鍵詞對於內存可見性的影響,固然volatile還會有其它性質如重排序。緩存
cpu和內存之間有多級緩存,通常有3級(L一、L二、L3,下個」CPU-Z「軟件就能看到了),那麼緩存與內存的數據就會存在一致性問題,CPU在設計的時候有專門的一致性協議(之後再說),volatile關鍵字就是影響一致性協議的方法之一即保證緩存與內存的數據是徹底一致的。若是不加這個關鍵字,不能保證數據一致性,請看如下代碼:設計
public class VolatileTest {
private boolean stopFlag = false;排序
public static void main(String[] args) {
VolatileTest vt = new VolatileTest();
new Thread() {
public void run() {
try {
Thread.sleep(2000);
vt.stopFlag = true;
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
new Thread() {內存
public void run() {
while (!vt.stopFlag) {
}
System.out.println("退出循環!");
}
}.start();io
}
}class
運行後,程序不會中止。軟件
當stopFlag加上volatile關鍵字後,程序打印」退出循環「。循環