關於Java內存模型自己的理解:
JVM運行程序的實體是線程,而每個線程在運行時都會爲其創建一個獨立的內存空間(Java棧,線程私有的),而成員變量是存儲在堆空間(線程共享的),JMM規定所有變量都存儲在主內存,所有線程都可訪問,但是不能直接操作主內存中的變量,對變量的操作(讀取賦值等)必須在工作內存中進行,因此要將變量從主內存拷貝到自己的工作空間,然後對變量進行操作,操作完成再將變量寫回主內存,因此不同的線程無法訪問對方的工作內存,線程間的通訊(傳值) 必須通過主內存來完成。
volatile可見性代碼演示:
public class TestVolatile {
private static volatile int a = 0;
public static void main(String[] args) {
new Thread(() -> {
try {
//保證所有線程都能讀到a的值,a的值更新操作需要1S
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
a = 22;
}).start();
//因爲加了volatile關鍵字,main線程可以感知到a的變化
while (a == 0) {
}
//因此這裏很快就打出了a的值,如果不加此關鍵字,會一直在while循環,不會走到這裏
System.out.println(a);
}
}