
| 操作 | 作用對象 | 說明 |
|---|---|---|
lock | 主內存變量 | 標記為線程獨佔 |
unlock | 主內存變量 | 釋放獨佔,允許其他線程 lock |
read | 主內存變量 | 從主內存讀取值 → 傳給工作內存 |
load | 工作內存變量 | 將 read 獲得的值放入工作內存副本 |
use | 工作內存變量 | 從工作內存傳值給執行引擎 |
assign | 工作內存變量 | 執行引擎賦值 → 工作內存副本 |
store | 工作內存變量 | 從工作內存取值 → 傳給主內存 |
write | 主內存變量 | 將 store 獲得的值寫入主內存 |
read/load、store/write 必須成對、有序執行(中間可插入其他指令)。store/write)。assign 不得 store/write 回主內存。load/assign 初始化。lock;可重入,需對應次數 unlock。lock 後,工作內存該變量值失效,需重新 load/assign。unlock 當前線程已 lock 的變量。store/write 將修改刷回主內存後才能 unlock。| 保證 | 實現機制 |
|---|---|
| 可見性 | 寫入時立即 store/write 刷主內存;讀取前立即 read/load 取最新值。 |
| 禁止指令重排 | 寫屏障(StoreStore + StoreLoad);讀屏障(LoadLoad + LoadStore)。 |
volatile boolean shutdown = false;volatile Singleton instance;volatile int count = 0;
// 多線程 count++ 仍不安全(read-modify-write 非原子)
// 需用 AtomicInteger 或 synchronized
final 域賦值。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 進行併發測試驗證。