JMM內存模型及Volatile的原子性Demo

關於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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章