volatile
理解volatile特性的一個好方法:
把對volatile變量的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步
鎖的happens-before規則保證釋放鎖和獲取鎖的兩個線程之間的內存可見性,
這意味這對一個volatile變量的讀,總是能看到任意線程對這個volatile變量最後的寫入值
鎖的語義決定了臨界區代碼的執行具有原子性
如果是多個volatile操作或類似於volatile++這種複合操作,這些操作整體上不具有原子性
從JSR-133開始,volatile變量的寫-讀可以實現線程之間的通信
從內存語義的角度來看:
1.volatile的寫-讀與鎖的釋放-獲取有相同的內存效果
2. volatile寫和鎖的釋放有相同的內存語義
3. volatile讀與鎖的獲取有相同的內存語義
鎖釋放和獲取的內存語義
當線程釋放鎖的時候,JMM會把線程對應的本地內存中的共享變量刷新到主內存中
當線程獲取鎖時,JMM會把線程對應的本地內存置爲無效,
從而使得被監視器保護的臨界區代碼必須要從主內存中去讀取共享變量
volatile寫-讀的內存語義
當寫一個volatile變量時,JMM會把線程對應的本地內存中的共享變量值刷新到主內存
當讀一個volatile變量時,JMM會把線程對應的本地內存置爲無效,線程接下來將從主內存中讀取共享變量