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

Java 內存模型(JMM)深度解析:線程交互操作、八大原子操作、volatile 與 final 語義

     編輯:Java 綜合教學

一、JMM 抽象結構:主內存與工作內存

JMM 結構圖

  • 主內存:存儲所有共享變量(實例字段、靜態字段、數組元素),堆內存中。
  • 工作內存:每個線程私有,保存共享變量的副本(CPU 寄存器、L1/L2 緩存、本地內存抽象)。
  • 交互規則:線程只能操作工作內存,讀寫主內存需通過八大原子操作;線程間通信必須經主內存中轉。

二、八大原子操作

操作作用對象說明
lock主內存變量標記為線程獨佔
unlock主內存變量釋放獨佔,允許其他線程 lock
read主內存變量從主內存讀取值 → 傳給工作內存
load工作內存變量將 read 獲得的值放入工作內存副本
use工作內存變量從工作內存傳值給執行引擎
assign工作內存變量執行引擎賦值 → 工作內存副本
store工作內存變量從工作內存取值 → 傳給主內存
write主內存變量將 store 獲得的值寫入主內存

三、操作執行規則(JMM 強制約束)

  1. 成對出現:read/load、store/write 必須成對、有序執行(中間可插入其他指令)。
  2. 不允許丟棄 assign:工作內存修改後必須同步回主內存(store/write)。
  3. 無原因不同步:未發生 assign 不得 store/write 回主內存。
  4. 變量誕生於主內存:使用前必須 load/assign 初始化。
  5. lock 互斥:同一時刻僅一線程可 lock;可重入,需對應次數 unlock。
  6. lock 清空工作內存:執行 lock 後,工作內存該變量值失效,需重新 load/assign。
  7. unlock 前提:僅能 unlock 當前線程已 lock 的變量。
  8. unlock 前必須同步:store/write 將修改刷回主內存後才能 unlock。

四、volatile 關鍵字語義

保證實現機制
可見性寫入時立即 store/write 刷主內存;讀取前立即 read/load 取最新值。
禁止指令重排寫屏障(StoreStore + StoreLoad);讀屏障(LoadLoad + LoadStore)。

典型適用場景

  • 狀態標誌位:volatile boolean shutdown = false;
  • 單例 DCL(雙重檢查鎖):volatile Singleton instance;
  • 獨立觀察者模式:一寫多讀,無複合邏輯。

⚠️ 不保證原子性

volatile int count = 0;
// 多線程 count++ 仍不安全(read-modify-write 非原子)
// 需用 AtomicInteger 或 synchronized

五、final 域特殊語義

初始化安全性保證

  1. 構造器內對 final 域賦值。
  2. 構造器未發生 this 引用逃逸(未將 this 傳給其他線程/集合/事件監聽器)。

→ 該對象對所有線程可見,且 final 域值永不改變,無需同步即可安全共享。

編譯器/處理器插入的屏障

  • 寫最終屏障:構造器結束前,確保 final 域寫入對其他線程可見(禁止 final 寫入與構造器引用賦值重排)。
  • 讀最終屏障:讀取對象引用後,首次讀 final 域前,確保看到最新值。

經典案例:不可變對象

public final class ImmutablePoint {
    public final int x, y;
    public ImmutablePoint(int x, int y) { this.x = x; this.y = y; }
}
// 發布後無需同步,任意線程直接讀 x/y 安全

六、總結對比表

關鍵字可見性有序性(禁止重排)原子性典型用途
volatile✅✅❌狀態標誌、DCL、獨立觀察
final✅(構造後)✅(構造/讀取屏障)❌不可變對象、安全發布
synchronized✅✅✅複合操作、臨界區
Lock✅✅✅精細控制、公平鎖、條件變量
Atomic*✅✅(CAS)✅(單變量)計數器、累加器、CAS 更新

深度理解 JMM,是寫出正確、高性能併發代碼的基石。建議配合 javap -v 查看字節碼屏障指令、JCStress 進行併發測試驗證。

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