1. 程式人生 > >volatile 記憶體語義

volatile 記憶體語義

讀記憶體語義:當讀一個 volatile 變數時,JMM 將該執行緒對應的本地記憶體置為無效,從主記憶體中讀取共享變數。

寫記憶體語義:當寫一個 volatile 變數時,JMM 將該執行緒對應的本地記憶體中的共享變數值重新整理到主記憶體。

讀寫記憶體語義加起來,就能保證可見性:一個執行緒修改了 volatile 修飾的共享變數之後,另一個執行緒可以讀到這個修改後的值。

記憶體語義怎麼實現?需要 JMM 限制《重排序》。

限制規則如下圖:

volatile 讀寫之間禁止重排序是毋庸置疑的。

另外請看下圖,為了保證 1 happen before 4,另外兩項重排序也是需要禁止的。

而限制重排序的手段就是插入記憶體屏障:

  • 在每個 volatile 讀操作的後面插入一個 LoadLoad 屏障。
  • 在每個 volatile 讀操作的後面插入一個 LoadStore 屏障。
  • 在每個 volatile 寫操作的前面插入一個 StoreStore 屏障。
  • 在每個 volatile 寫操作的後面插入一個 StoreLoad 屏障。

記憶體屏障的型別: