天天看點

Java并發-記憶體屏障

現代的處理器使用寫緩沖區臨時儲存記憶體寫入的資料。寫緩沖區可以保證指令流水線持續運作,他可以避免由于處理器停頓下來等待記憶體寫入資料而産生的延遲。同時,通過以批處理的方式重新整理寫緩沖區,以及合并寫緩沖區中對同一個記憶體位址的多次寫,減少對記憶體總線的占用。每個處理去上的寫緩沖區,僅僅對它所在的處理器可見。這個特性會對記憶體操作的執行順序産生重要的影響:處理器對記憶體的讀/寫操作的執行順序,不一定與記憶體實際發生的讀/寫操作順序一緻。

Java并發-記憶體屏障

如果并行執行,最終可能得倒x=y=0

Java并發-記憶體屏障

可能執行的順序是A1-A2-A3

為了保證記憶體可見性,Java編譯器在生成指令序列的适當為止會插入記憶體屏障

Java并發-記憶體屏障

StoreLoad是一個全能型的屏障,同時具有其他3個屏障的效果。現代的多處理器大多支援該屏障(其他類型的屏障不一定被所有處理器支援)。這個屏障開銷會很昂貴,因為目前處理器通常要把寫緩沖區中的資料全部重新整理到記憶體中。