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

Java 多線程內存模型深度解析(二):主內存與工作內存、八大交互操作、三大特性與同步機制

     編輯:Java 綜合教學

Java 多線程內存模型深度解析(二):主內存與工作內存、八大交互操作、三大特性與同步機制

Java 內存模型 (JMM) 定義了線程與主內存交互的規範,是理解並發編程的基石。本節系統講解線程內存結構、八大原子操作、原子性/可見性/有序性三大特性及同步機制。

一、線程內存結構圖

JMM 內存結構

  • 主內存:存儲所有共享變量(實例字段、靜態字段、數組元素),線程間通信必經之地。
  • 工作內存:每條線程私有,保存共享變量的副本拷貝,線程只能操作工作內存,無法直接讀寫主內存。
  • 局部變量/方法參數:線程私有,不在 JMM 管理範圍,不存在共享問題。

二、主內存與工作內存八大交互操作

JMM 定義八種原子操作,完成副本拷貝與同步:

操作作用對象說明
lock主內存變量標記變量為線程獨占
unlock主內存變量釋放獨占狀態
read主內存變量將變量值從主內存傳輸到工作內存,供 load 使用
load工作內存變量將 read 獲得的值放入工作內存副本
use工作內存變量將工作內存值傳遞給執行引擎(字節碼指令使用)
assign工作內存變量執行引擎賦值給工作內存變量
store工作內存變量將工作內存值傳送到主內存,供 write 使用
write主內存變量將 store 獲得的值寫入主內存變量

規則:read→load 必須成對出現(主→工作),store→write 必須成對出現(工作→主),不可單獨出現。

三、多線程三大特性

1. 原子性

操作不可分割,CPU 不會中途暫停調度。JMM 保證基本類型讀寫(除 long/double)原子,synchronized、Lock、原子類可擴展原子性範圍。

2. 可見性

一線程修改共享變量,其他線程立即可見。依賴主內存作為傳遞媒介:寫線程 store/write 刷新主內存,讀線程 read/load 獲取最新值。volatile、synchronized、final 保證可見性。

3. 有序性

  • 線程內有序:單線程觀察,操作按代碼順序執行(as-if-serial 語義)。
  • 線程間無序:指令重排序(編譯器/CPU 優化)+ 工作內存同步延遲,導致其他線程觀察到亂序。

volatile 禁止指令重排,synchronized 鎖內串行化,實現有序性。

四、同步機制核心三把鎖

1. volatile

  • 保證可見性 + 禁止指令重排(內存屏障)。
  • 不保證原子性(如 volatile int i; i++ 非原子)。
  • 適用:狀態標記、單次寫入多次讀取、DCL 單例。

2. synchronized

  • 保證原子性 + 可見性 + 有序性(全能)。
  • 監視器鎖:對象頭 Mark Word、Monitor 對象、WaitSet/EntryList。
  • 鎖升級:偏向鎖 → 輕量級鎖 → 重量級鎖(JDK 6+ 優化)。

3. final

  • 構造函數內對 final 域寫入,且構造函數未引用逃逸,則其他線程可見最終值(無需同步)。
  • final 引用類型:引用不可變,但對象內部可變,需自行同步。

五、總結

JMM 通過主/工作內存抽象、八大操作規範、三大特性定義,構建了 Java 並發的理論基石。volatile/synchronized/final 是開發者操控 JMM 行為的核心工具,選型原則:能用 volatile 不用 synchronized,能用 final 不用 volatile,能用線程局部/不可變對象不需同步。

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