可見性

不可見的原因.jpg

synchronized.png

image.png
volatile變量在每次被線程訪問時都強迫從主內中讀取該變量的值,而該變量發(fā)生變化時都會強迫線程將該變量的值刷新到主內存中,這樣,任何時候所有線程都能看到該變量的最新值

volatile寫.png

volatile讀.png
/**
* 當兩個線程同時執(zhí)行了第一步, 就都讀到了count的值, 比如是5
* 兩個線程同時執(zhí)行了+1操作并寫回主存,這樣就丟了一次+1的操作,結果是6問不是5
*/
public static void add(){
// 1. 去讀內存中的count值
// 2. +1
// 3. count寫回主存
count++;
}
volatile不具有原子性
使用volatile需要具備兩個條件:
- 對變量的寫操作不依賴于當前值
- 該變量沒有包含在具有其他變量的不變的式子中,因此
volatile特別適合作為狀態(tài)標記量。
boolean.png
