記憶體屏障 volatile 鎖 final

2021-08-18 20:51:15 字數 1012 閱讀 8771

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引用的物件的成員域的寫入,與隨後在建構函式外把這個被構造物件的引用賦值給乙個引用變數,這兩個操作之間不能重排序。

volatile 與記憶體屏障

volatile c語言中 volatile 關鍵字用於告訴編譯器,嚴禁將此處的彙編語句與其它的語句重組合優化。volatile只能保證編譯器不會做亂序執行優化.1.不對 p操作生成亂序指令 通常如此,具體請看後面的解釋 比如條件判斷 2.每次從 p取資料的時候,一定會進行一次訪存操作,哪怕前面不久...

volatile和記憶體屏障(dmb)

volatile c語言中 volatile 關鍵字用於告訴編譯器,嚴禁將此處的彙編語句與其它的語句重組合優化。volatile只能保證編譯器不會做亂序執行優化.1.不對 p操作生成亂序指令 通常如此,具體請看後面的解釋 比如條件判斷 2.每次從 p取資料的時候,一定會進行一次訪存操作,哪怕前面不久...

關於 volatile 可見性,有序性,記憶體屏障

public class demo1 system.out.println test finish public void setflag boolean flag public static void main string args start new thread start 事實上,控制台不...