1. 程式人生 > >volatile 內存語義

volatile 內存語義

rri jmm pen htm ola adl 一個 icm tile

讀內存語義:當讀一個 volatile 變量時,JMM 將該線程對應的本地內存置為無效,從主內存中讀取共享變量。

寫內存語義:當寫一個 volatile 變量時,JMM 將該線程對應的本地內存中的共享變量值刷新到主內存。

讀寫內存語義加起來,就能保證可見性:一個線程修改了 volatile 修飾的共享變量之後,另一個線程可以讀到這個修改後的值。

內存語義怎麽實現?需要 JMM 限制《重排序》。

限制規則如下圖:

技術分享圖片

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

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

技術分享圖片

而限制重排序的手段就是插入內存屏障:

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

內存屏障的類型:

技術分享圖片

volatile 內存語義