在《Java 垃圾回收整理》一文中,我們已概覽 JVM 運行時記憶體區域劃分。本文聚焦於 JVM 虛擬機棧(執行緒堆疊) 與 堆記憶體 之間的變數存取與同步機制,這是理解 Java 併發程式設計的基石。
當執行緒需要存取物件欄位時,流程如下:
下圖說明此交互流程:

Java 記憶體模型(JMM)規範了主記憶體與工作記憶體交互的八種原子操作:
| 操作 | 作用對象 | 說明 |
|---|---|---|
| read / load | 主記憶體 → 工作記憶體 | 從主記憶體讀取變數值並載入工作記憶體 |
| use / assign | 工作記憶體 | 執行程式碼,修改工作記憶體中的變數副本(可多次出現) |
| store / write | 工作記憶體 → 主記憶體 | 將工作記憶體資料刷新回主記憶體 |
上述操作並非不可分割的原子操作序列。若執行緒 1 執行 read/load 後,主記憶體變數被執行緒 2 修改,執行緒 1 的工作記憶體不會自動感知,導致運算結果與預期不符(典型的臟讀)。
volatile 關鍵字僅保證:
read/load 時從主記憶體獲取最新值但 volatile 無法保證原子性。考慮 count++ 這類「讀取-修改-寫入」複合操作:
read/load 取得 count = 5write 回主記憶體 → count = 6write → count = 6(預期應為 7)結果:兩執行緒皆用 volatile 修飾,仍發生更新遺失。對於複合操作,必須使用 synchronized、Lock 或 AtomicInteger 等原子類別。
volatile 僅解決可見性與有序性,不解決原子性synchronized/Lock/原子類別)深入理解這套模型,是編寫正確、高效能 Java 併發程式的前提。