什么是重排序?重排序是指令的重排序。
為了提高性能,編譯器和處理器常常會對指令做重排序,重排序就會導致多線程執行的時候有數據不一致問題,導致程序結果不是理想結果。
重排序分為三類:
-
編譯器重排序:不改變單線程程序語義前提下,重新安排執行順序
-
指令級並行重排序:指令並行技術可以將多條指令重疊執行,如果不存在數據依賴性,處理器會改變語句對應的機器指令執行順序
-
內存系統重排序
1 是屬於編譯器重排序,2 和 3 屬於處理器重排序,都會引起多線程程序的內存可見性問題。
對於編譯器,JMM編譯器會禁止特定類型的編譯器重排序,對於處理器,JMM處理器重排序規則會要求Java編譯器在生成指令的時候插入內存屏障指令來禁止特定的重排序。
不同處理器重排序規則

常見的處理都允許 store-load (寫-讀)進行重排序,都禁止有數據依賴的重排序
內存屏障
為了保證內存數據的可見性,JMM處理器重排序規則會要求Java編譯器在生成指令的時候插入內存屏障指令來禁止特定的重排序。JMM中將內存屏障分為四類
-
LoadLoad Barriers
-
StoreStore Barriers
-
LoadStore Barriers
-
StoreLoad Barriers