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

Java 記憶體模型深度解析:執行緒棧、堆、硬體記憶體架構、volatile 與同步

     編輯:Java 相關知識

JMM 邏輯視圖:執行緒棧與堆

  • 執行緒棧:每條執行緒私有,存放區域變數 (基本型別直接存值、引用型別存指向堆物件的參考)、呼叫框架
  • 堆:所有執行緒共享,存放所有物件 (含基本型別包裝物件)、靜態欄位

區域變數不可見於其他執行緒;物件在堆上對所有持有參考的執行緒可見。

硬體記憶體架構對應

  • CPU 寄存器 → 最快、執行緒私有
  • CPU 快取 (L1/L2/L3) → 次快、核心私有或共享
  • 主記憶體 (RAM) → 最慢、所有核心共享

JMM 規範變數何時在執行緒間可見,對應硬體的快取一致性協定 (MESI 等)。

兩大核心問題

1. 共享變數可見性

執行緒 A 修改堆上物件,未刷新至主記憶體前,執行緒 B 讀取舊值。

// 解決:volatile 強制讀寫主記憶體
volatile int count = 0;

2. 競態條件

多執行緒同時讀修寫同一變數 (如 count++ 非原子)。

// 解決:synchronized 互斥 + 記憶體屏障
synchronized(lock) { count++; }

volatile 語義 (JSR-133)

  • 可見性:寫入 volatile 立即刷新主記憶體,讀取立即從主記憶體載入
  • 禁止指令重排:寫入前的操作不會重排到寫入後,讀取後的操作不會重排到讀取前
  • 不保證原子性:volatile int i; i++; 仍非原子

synchronized 語義

  • 互斥:同一時間僅一執行緒進入臨界區
  • 可見性:進入同步塊前讀取主記憶體,退出時刷新主記憶體
  • 可重入:同一執行緒可重複獲得鎖

實務建議

常見誤區

  • volatile 替代 synchronized (原子性缺失)
  • 雙重檢查鎖單例未加 volatile (指令重排導致半初始化物件可見)
  • synchronized 方法鎖住整個物件,粒度過粗
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦方案
單一旗標/狀態volatile boolean flag
計數器/複雜邏輯AtomicInteger / synchronized / Lock
高併發讀多寫少ReadWriteLock / StampedLock
無鎖演算法CAS (compareAndSet) / AtomicReference