1. 程式人生 > >java volatile 關鍵詞

java volatile 關鍵詞

volatile

特性:

  1. 可見性:對一個volatile變數的讀,總是能看到(任意執行緒)對這個volatile變數最後的寫入。
  2. 原子性:對任意單個volatile變數讀寫具有原子性,類似volatile++這種複合操作不具有原子性。
  3. 順序性:對於volatile 修飾的關鍵字在編譯的時候會加 記憶體屏障 fang防止衝排序

volatile 的可見性:

如圖 volatile 修飾的變數 bool 初始值是 1, 執行緒ABC本地快取中的值也是1.

當執行緒A 寫入bool 時 bool的值會被刷入到主記憶體  此時 jmm會把 執行緒BC中對bool的快取設定為無效 BC執行緒讀取的時候就需要到主記憶體存去讀這樣就保證了keji可見性。

 

volatile 的原子性:

    由於volatile 的可見性所以保證了 對任意單個volatile變數讀寫具有原子性。

注意點:volatile++ 是不具有原子性的。

    volatile static int a = 1;
    public static void main(String[] args) {
        for (int i = 0; i < 30; i++) {
            new Thread(()->a++).start();
        }
        System.out.println(a);
    }

他的結果是28 也可能是 29 這種複合操作不具備原子性。