簡述
Java虛擬機規范中試圖定義一種Java內存模型(Java Memory Model,JMM)來屏蔽掉各種硬件和操作系統的內存訪問差異,以實現讓Java程序在各種平台下都能達到一致的內存訪問效果。
定義模型的目標
Java內存模型的主要目標是定義程序中各個變量的訪問規則,即在虛擬機中將變量存儲到內存和從內存中取出變量這樣的底層細節。
這里說的變量包括實例字段、靜態字段和構成數組對象的元素,不包括局部變量與方法參數,因為后者是線程私有的,不會共享,也就不存在競爭的問題。
主內存與工作內存
Java內存模型規定了所有的變量都存儲在主內存(Main Memory)中,此外每條線程還有自己的工作內存(Working Memory)。
線程的工作內存中保存了被該線程使用到的變量的主內存副本拷貝,線程對變量的所有操作(讀取、賦值等)都必須在工作內存中進行,不能直接讀寫主內存中的變量。
並且,不同的線程之間也無法直接訪問對方工作內存中的變量,線程間變量值得傳遞均需要通過主內存來完成,線程、主內存、工作內存關系如下圖:

也可以把這里的主內存與工作內存概念與JVM運行時數據區進行對應,主內存主要對應Java堆中的對象實例數據部分,工作內存對應於虛擬機棧中的部分區域。
內存間的交互動作
| 動作 | 作用 |
| lock (鎖定) |
作用於主內存變量,把一個變量標示為一條線程獨占的狀態 |
| unlock (解鎖) |
作用於主內存的變量,把一個處於鎖定狀態的變量釋放出來,釋放后的變量才可以被其他線程鎖定 |
| read (讀取) |
作用於主內存的變量,把一個變量的值從主內存傳輸到線程的工作內存中,以便隨后的load動作使用 |
| load (載入) |
作用於工作內存的變量,把read操作從主存中得到的變量值放入工作內存的變量副本中 |
| use (使用) |
作用於工作內存的變量,把工作內存中一個變量的值傳遞給執行引擎,每當虛擬機遇到一個需要使用到變量的值的字節碼指令時將會執行這個操作 |
| assign (賦值) |
作用於工作內存的變量,把一個從執行引擎接收到的值賦給工作內存中的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作 |
| store (存儲) |
作用於工作內存的變量,把工作內存中一個變量的值傳送到主內存中,以便隨后的write操作使用 |
| write (寫入) |
作用於主內存的變量,把store操作從工作內存中得到的變量的值放入主內存的變量中 |

