內存屏障
內存屏障(Memory Barrier,或有時叫做內存柵欄,Memory Fence)是一種 CPU 指令,用于控制特定條件下的重排序和內存可見性問題。Java 編譯器也會根據內存屏障的規則禁止重排序。Java 編譯器在生成指令序列的適當位置會插入內存屏障指令來禁止特定類型的處理器重排序,從而讓程序按我們預想的流程去執行。
保證特定操作的執行順序。
影響某些數據(或者是某條指令的執行結果)的內存可見性。
編譯器和 CPU 能夠重排序指令,保證最終相同的結果,嘗試優化性能。插入一條 Memory Barrier 會告訴編譯器和 CPU:
不管什么指令都不能和這條 Memory Barrier 指令重排序。
Memory Barrier 所做的另外一件事是強制刷出各種 CPU cache,如一個 Write-Barrier(寫入屏障)將刷出所有在 Barrier 之前寫入 cache 的數據,因此,任何 CPU 上的線程都能讀取到這些數據的最新版本。
目前有 4 種屏障.。
LoadLoad 屏障
序列:Load1,Loadload,Load2 讀 讀 大白話就是 Load1 一定要在 Load2 前執行,及時 Load1 執行慢 Load2 也要等 Load1 執行完。通常能執行預加載指令 / 支持亂序處理的處理器中需要顯示聲明 Loadload 屏障,因為在這些處理器中正在等待的加載指令能夠繞過正在等待存儲的指令。而對于總是能保證處理順序的處理器上,設置該屏障相當于無操作。
StoreStore 屏障寫寫
序列:Store1,StoreStore,Store2 大白話就是 Store1 的指令任何操作都可以及時的從高速緩存區寫入到共享區,確保其他線程可以讀到最新數據,可以理解為確??梢娦?。通常情況下,如果處理器不能保證從寫緩沖或 / 和緩存向其它處理器和主存中按順序刷新數據,那么它需要使用 StoreStore 屏障。
LoadStore 屏障讀寫
序列:Load1; LoadStore; Store2 大致作用跟第一個類似,確保 Load1 的數據在 Store2 和后續 Store 指令被刷新之前讀取。在等待 Store 指令可以越過 loads 指令的亂序處理器上需要使用 LoadStore 屏障。
StoreLoad 屏障寫讀
序列: Store1; StoreLoad; Load2 確保 Store1 數據對其他處理器變得可見(指刷新到內存),之前于 Load2 及所有后續裝載指令的裝載。StoreLoad Barriers 會使該屏障之前的所有內存訪問指令(存儲和裝載指令)完成之后,才執行該屏障之后的內存訪問指令。StoreLoad Barriers 是一個全能型 的屏障,它同時具有其他 3 個屏障的效果?,F代的多處理器大多支持該屏障(其他類型的屏障不一定被所有處理器支持)。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.