首先要知道記憶體屏障是什麼,
記憶體屏障是乙個cpu指令,記憶體屏障是這樣的指令
1,確保特定操作執行的順序
2,影響一些資料的可見性,編譯器和cpu可以保證輸出結果一樣的前提下對指令進行重排序,使得效能優化,當插入乙個記憶體屏障,相當於告訴cpu和編譯器,先於這個命令的必須先執行,後於這個命令的必須後執行
3,強制更新一次不同的cpu快取,比如乙個寫屏障會把這個屏障前寫入的資料重新整理到快取,任何師徒讀取改資料的執行緒將得到最新的值
loadload屏障
對於load1; loadload; load2 ,作業系統保證在load2及後續的讀操作讀取之前,load1已經讀取。
storestore屏障
對於store1; storestore; store2 ,作業系統保證在store2及後續的寫操作寫入之前,store1已經寫入。
loadstore屏障
對於load1; loadstore; store2,作業系統保證在store2及後續寫入操作執行前,load1已經讀取。
storeload屏障
對於store1; storeload; load2 ,作業系統保證在load2及後續讀取操作執行前,store1已經寫入,開銷較大,但是同時具備其他三種屏障的效果。
此處見原部落格:記憶體屏障和volatile
volatile修飾的變數,jmm將在寫操作後插入乙個寫屏障指令,在讀操作前插入乙個讀屏障指令,這代表著:
1,一旦有現成對變數寫入了新值,任何訪問這個變數的執行緒都會得到新的值
2,在寫入前,也會保證所有之前發生的事情已經發生,並且更新過的資料值也是可見的。記憶體屏障會把之前的寫入值都重新整理到快取
所以volatile可以保證可見性
volatile是如何保證記憶體可見性的
volatile 修飾的變數具備兩種特性 cpu修改資料,首先是對快取的修改,然後再同步回主存,在同步回主存的時候,如果其他cpu也快取了這個資料,就會導致其他cpu快取上的資料失效 通過嗅探匯流排資料傳播,檢查快取對應的主存位址是否被修改過 這樣,當其他cpu再去它的快取讀取這個資料的時候發現快取...
volatile如何保證可見性和防止重排序
1 保證可見性 記憶體可見性是指乙個cpu對資料修改,對其他cpu立即可見。1 cpu對資料修改 cpu對資料的修改總是先修改工作記憶體,然後再同步回主記憶體,只不過是對被volatile修飾變數的修改,會立刻同步回主記憶體。2 對其他cpu立即可見 當cpu a修改完volatile變數,並且立即...
volatile關鍵字如何保證記憶體可見性
一 記憶體可見性 例子1 有乙個全域性的狀態變數open boolean open true 這個變數用來描述對乙個資源的開啟關閉狀態,true表示開啟,false表示關閉,假設有乙個執行緒a,在執行一些操作後將open修改為false 執行緒a resource.close open false ...