java volatile 關鍵詞
阿新 • • 發佈:2018-11-09
volatile
特性:
- 可見性:對一個volatile變數的讀,總是能看到(任意執行緒)對這個volatile變數最後的寫入。
- 原子性:對任意單個volatile變數讀寫具有原子性,類似volatile++這種複合操作不具有原子性。
- 順序性:對於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 這種複合操作不具備原子性。