Load Barrier 和 Store Barrier即讀屏障和寫屏障
記憶體屏障的作用:
- 禁止指令重排序
- 強制将寫緩沖區和高速緩存中的資料寫回系統記憶體,讓緩存中的資料失效
- 對于Load Barrier來說,在指令前插入Load Barrier,可以讓高速緩存中的資料失效,強制從新從主記憶體加載資料;
- 對于Store Barrier來說,在指令後插入Store Barrier,能讓寫入緩存中的最新資料更新寫入主記憶體,讓其他線程可見
java的記憶體屏障
- 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寫操作前插入StoreStore屏障,在寫操作後插入StoreLoad屏障
在每個volatile讀操作前插入LoadLoad屏障,在讀操作後插入LoadStore屏障;