天天看點

volatile 記憶體屏障

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屏障;

繼續閱讀