重排序


什么是重排序?重排序是指令的重排序。

為了提高性能,編譯器和處理器常常會對指令做重排序,重排序就會導致多線程執行的時候有數據不一致問題,導致程序結果不是理想結果。
 
重排序分為三類:
  1. 編譯器重排序:不改變單線程程序語義前提下,重新安排執行順序
  2. 指令級並行重排序:指令並行技術可以將多條指令重疊執行,如果不存在數據依賴性,處理器會改變語句對應的機器指令執行順序
  3. 內存系統重排序

 

 

1 是屬於編譯器重排序,2 和 3 屬於處理器重排序,都會引起多線程程序的內存可見性問題。

 

對於編譯器,JMM編譯器會禁止特定類型的編譯器重排序,對於處理器,JMM處理器重排序規則會要求Java編譯器在生成指令的時候插入內存屏障指令來禁止特定的重排序。
不同處理器重排序規則

常見的處理都允許 store-load (寫-讀)進行重排序,都禁止有數據依賴的重排序

 

內存屏障

為了保證內存數據的可見性,JMM處理器重排序規則會要求Java編譯器在生成指令的時候插入內存屏障指令來禁止特定的重排序。JMM中將內存屏障分為四類
  • LoadLoad Barriers
  • StoreStore Barriers
  • LoadStore Barriers
  • StoreLoad Barriers

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM