1. 程式人生 > >一步一步學JVM-Java內存模型

一步一步學JVM-Java內存模型

jvm 值傳遞 都是 ssi 方法參數 自己 vol 字節 ati

主內存與工作內存

Java內存模型的主要目標是定義程序中各個變量的訪問規則。即在虛擬機中將變量存儲到內存和從內存中取出變量這樣的底層細節。這裏的變量和Java編程中所說的變量有所區別,它包括了實例字段、靜態字段和構成數組對象的元素。但不包括局部變量和方法參數。

Java內存模型規定了所有的變量都存儲在主內存中,每條線程都有自己的工作內存,線程的工作內存中保存了被該線程使用到的變量的主內存副本拷貝,線程對變量的所有操作都必須在工作內存中進行,而不能直接讀寫主內存中的變量。不同的線程之間也無法訪問對方工作內存中的變量,線程間變量值的傳遞均需要通過主內存來完成。

線程、主內存和工作內存三者的交互關系如圖所示:

內存間交互操作

關於主內存與工作內存之間具體的交互協議,即一個變量如何從主內存拷貝到工作內存、如何從工作內存同步回主內存之類的細節,Java內存模型定義了一下8中操作來完成。虛擬機實現時必須保證下面體積的每一種操作都是原子的、不可再分的。

1、 lock:作用於主內存的變量,它把一個變量表示為一條線程獨占的狀態。

2、 unlock:作用於主內存的變量,它把一個處於鎖定狀態的變量釋放出來,釋放後的變量才可以被其他線程鎖定。

3、 read:作用於主內存的變量,它把一個變量的值從主內存傳輸到線程的工作內存中,以便隨後的loadd動作使用。

4、 load:作用於工作內存的變量,它把read操作從主內存中得到的變量值放入工作內存的變量副本中。

5、 use:作用於工作內存的變量,它把工作內存中一個變量的值傳遞給執行引擎,每當虛擬機遇到一個需要使用變量的值的字節碼指令時將會執行這個操作。

6、 assign:作用於工作內存的變量,它把一個從執行引擎接收到的值賦給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。

7、 store:作用於工作內存的變量,它把一個從執行引擎接收到的值賦給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。

8、 write:作用於主內存的變量,它把store操作從工作內存中得到的變量的值放入主內存的變量中。

volatile的語義

1、 保證此變量對所有線程的可見性

2、 禁止指令重排序優化

一步一步學JVM-Java內存模型