Java虛擬機規範中試圖定義一種Java內存模型(Java Memory Model,JMM)來屏蔽掉各類硬件和操做系統的內存訪問差別,以實現讓Java程序在各類平臺下都能達到一致的內存訪問效果。數組
Java內存模型的主要目標是定義程序中各個變量的訪問規則,即在虛擬機中將變量存儲到內存和從內存中取出變量這樣的底層細節。
這裏說的變量包括實例字段、靜態字段和構成數組對象的元素,不包括局部變量與方法參數,由於後者是線程私有的,不會共享,也就不存在競爭的問題。操作系統
Java內存模型規定了全部的變量都存儲在主內存(Main Memory)中,此外每條線程還有本身的工做內存(Working Memory)。線程
線程的工做內存中保存了被該線程使用到的變量的主內存副本拷貝,線程對變量的全部操做(讀取、賦值等)都必須在工做內存中進行,不能直接讀寫主內存中的變量。3d
而且,不一樣的線程之間也沒法直接訪問對方工做內存中的變量,線程間變量值得傳遞均須要經過主內存來完成,線程、主內存、工做內存關係以下圖:對象
也能夠把這裏的主內存與工做內存概念與JVM運行時數據區進行對應,主內存主要對應Java堆中的對象實例數據部分,工做內存對應於虛擬機棧中的部分區域。blog
動做 | 做用 |
lock內存 (鎖定)虛擬機 |
做用於主內存變量,把一個變量標示爲一條線程獨佔的狀態 |
unlockit (解鎖)table |
做用於主內存的變量,把一個處於鎖定狀態的變量釋放出來,釋放後的變量才能夠被其餘線程鎖定 |
read (讀取) |
做用於主內存的變量,把一個變量的值從主內存傳輸到線程的工做內存中,以便隨後的load動做使用 |
load (載入) |
做用於工做內存的變量,把read操做從主存中獲得的變量值放入工做內存的變量副本中 |
use (使用) |
做用於工做內存的變量,把工做內存中一個變量的值傳遞給執行引擎,每當虛擬機遇到一個須要使用到變量的值的字節碼指令時將會執行這個操做 |
assign (賦值) |
做用於工做內存的變量,把一個從執行引擎接收到的值賦給工做內存中的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操做 |
store (存儲) |
做用於工做內存的變量,把工做內存中一個變量的值傳送到主內存中,以便隨後的write操做使用 |
write (寫入) |
做用於主內存的變量,把store操做從工做內存中獲得的變量的值放入主內存的變量中 |