1. 程式人生 > >記憶體屏障、volatile、鎖、final

記憶體屏障、volatile、鎖、final

1.     硬體層的記憶體屏障:Load Barrier 和 Store Barrier

作用:阻止屏障兩側的指令重排序;

      強制把寫緩衝區/快取記憶體中的髒資料等寫回主記憶體,讓快取中相應的資料失效。

對於Load Barrier來說,在指令前插入Load Barrier,可以讓快取記憶體中的資料失效,強制從新從主記憶體載入資料;

對於Store Barrier來說,在指令後插入Store Barrier,能讓寫入快取中的最新資料更新寫入主記憶體,讓其他執行緒可見。

2.     volatile記憶體語義

當對一個volatile變數進行寫操作的時候,JMM會把該執行緒對應的本地記憶體中的共享變數的值重新整理到主記憶體中。

當讀一個volatile變數的時候,JMM會把該執行緒對應的本地記憶體設定為無效,要求執行緒從主記憶體中讀取資料。

3.     volatile的實現

根據volatile重排序規則,在寫操作前面插入Store Store屏障;在寫操作後面插入storeload屏障;在讀操作後面插入loadload和loadstore屏障

(基於保守策略)

4.     鎖的記憶體語義

鎖釋放與volatile寫語義相同。鎖獲取與volatile讀語義相同。

5.     鎖的底層實現

依靠volatile變數和cas操作實現。

6.     final域記憶體語義

在物件引用為任意執行緒可見之前,物件的final域已經被正確初始化過,而普通域不具有這個保證。

7.     final域重排序規則

final域是基礎資料型別:

在建構函式內對一個final域的寫入,與隨後把這個被構造物件的引用賦值給一個引用變數,這兩個操作之間不能重排序。

初次讀一個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序。

Final域是引用資料型別:

在建構函式內對一個final引用的物件的成員域的寫入,與隨後在建構函式外把這個被構造物件的引用賦值給一個引用變數,這兩個操作之間不能重排序。