面試JVM(三)java記憶體模型
java虛擬機器規範檢視定義一種java記憶體模型來遮蔽掉各種硬體和作業系統的記憶體訪問差異,以實現讓java程式在各個平臺下都能達到一致的併發效果。
java記憶體模型主要目標是定義程式中各個變數的訪問規則,即在虛擬機器中將變數儲存到記憶體和從記憶體中取出變數這樣的底層細節。此處的變數包括例項欄位,靜態欄位和構成陣列物件的元素。
java記憶體模型規定了所有的變數都儲存在主記憶體中,每條執行緒還有自己的工作記憶體。
執行緒的工作記憶體中儲存了被該執行緒使用到的變數的主記憶體副本拷貝,執行緒對變數的所有操作都要在工作記憶體中進行,而不能直接讀寫主記憶體中的變數。不同的執行緒之間也無法直接訪問對方工作記憶體中的變數。
記憶體間互動:
關於主記憶體與工作記憶體之間的具體互動協議,即一個變數如何從主記憶體拷貝到工作記憶體,如何從工作記憶體同步回主記憶體子類的細節實現,java記憶體模型定義了八種操作:(這八個操作都具有原子性)
lock(鎖定):作用於主記憶體的變數,把一個變數標識為一條執行緒獨佔的狀態。
unclock(解鎖):作用於主記憶體的變數,把一個處於鎖定的狀態釋放出來。
read(讀取):作用於主記憶體的變數,把一個變數的值從主記憶體傳輸到執行緒的工作記憶體中
load(載入):作用於工作記憶體的變數,把read操作從主記憶體 得到的變數值放入工作記憶體的變數副本中。
use(使用):作用於工作記憶體的變數,把工作記憶體中一個變數的值傳遞給執行引擎,每當虛擬機器遇到一個需要使用到變數的 值的位元組碼指令時將會執行這個操作。
assign(賦值):作用於工作記憶體的變數,把一個從執行引擎接收到的值 賦值給工作記憶體的變數,每當虛擬機器遇到一個給變 量賦值的位元組碼指令時執行這個操作。
store(儲存):作用於工作記憶體的變數,把工作記憶體中的一個變數的值傳遞到主記憶體,以便write操作使用。
write(寫入):作用於主記憶體的變數,把store操作從工作記憶體中得到的變數的值放入主記憶體的變數中。