首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深入理解Java內存模型(七):總結篇——JMM設計哲學、處理器內存模型對比與順序一致性關係

     編輯:Java 相關知識

處理器內存模型分級與特徵

現代處理器為追求性能,對順序一致性模型進行不同程度放寬,形成強弱不同的內存模型:

模型典型處理器Store-LoadStore-StoreLoad-Load/Load-Store備註
TSOSPARC-TSO, x86/x64YNN僅允許寫-讀重排,寫緩衝區導致
PSOSPARC-PSOYYN進一步放寬寫-寫
RMOIA64YYY全面放寬,極弱模型
PowerPCPowerPCYYY含控制依賴重排

關鍵共性:所有模型均允許 Store-Load 重排(寫緩衝區特性),且當前處理器可提前讀見自身寫入。

JMM 屏蔽硬件差異:內存屏障插入策略

JMM不同處理器插入屏障示意

  • JMM 在字節碼生成階段插入屏障,抹平處理器模型差異
  • 越弱的處理器模型,需插入越多屏障(如 RMO 需全屏障)
  • x86 因模型較強,僅需在 volatile 寫後插入 StoreLoad 屏障

三大模型強弱關係圖譜

模型強弱對比

順序一致性 > 語言內存模型(JMM、C++11 等)> 處理器內存模型。追求性能的語言/處理器傾向設計更弱模型。

JMM 設計核心:程序員易用性 vs 編譯器/處理器優化自由度

雙重約束下的平衡藝術

double pi = 3.14; // A
double r = 1.0;   // B
double area = pi * r * r; // C

存在 3 個 happens-before:A→B、B→C、A→C(傳遞性)。但 A→B 重排不影響結果,JMM 允許此類「不改變單線程語義」的重排序。

分類治理策略

重排序類型JMM 策略
改變程序結果強制禁止(編譯器+處理器)
不改變程序結果允許(最大化優化空間)

JMM設計示意

JMM 內存可見性保證三層次

  1. 單線程:結果等同順序一致性模型
  2. 正確同步多線程:執行結果具備順序一致性(JMM 核心承諾)
  3. 未/錯誤同步多線程:最小安全性——讀到的值要么是寫入值,要么是默認值(0/null/false),杜絕「憑空產生」

三類程序執行結果對比

JSR-133 關鍵修補

  1. 增強 volatile 語義:嚴格限制 volatile 與普通變量重排,使 volatile 寫-讀具備鎖釋放-獲取同等語義
  2. 增強 final 語義:新增兩條重排序規則,賦予 final 初始化安全性,修復舊模型下 final 值可變缺陷(如 String 不可靠)

總結

JMM 以 happens-before 為核心抽象,向上給程序員提供簡單強一致性承諾,向下通過屏障插入適配多樣硬件,實現了「正確同步程序跨平台行為一致」的工程奇蹟。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved