java內存模型

Java內存模型即Java Memory Model,簡稱JMM。JMM定義了Java 虛擬機(JVM)在計算機內存(RAM)中的工作方式。
主內存與工作內存
Java內存模型的主要目標是定義程序中各個變量的訪問規則,即在虛擬機中將變量存儲到內存和從內存中取出變量這樣的底層細節。此處的變量主要是指共享變量,存在競爭問題的變量。Java內存模型規定所有的變量都存儲在主內存中,而每條線程還有自己的工作內存,線程的工作內存中保存了該線程使用到的變量的主內存副本拷貝,線程對變量的所有操作(讀取、賦值等)都必須在工作內存中進行,而不能直接讀寫主內存中的變量(根據Java虛擬機規範的規定,volatile變量依然有共享內存的拷貝,但是由於它特殊的操作順序性規定——從工作內存中讀寫數據前,必須先將主內存中的數據同步到工作內存中,所有看起來如同直接在主內存中讀寫訪問一般,因此這裏的描述對於volatile也不例外)。不同線程之間也無法直接訪問對方工作內存中的變量,線程間變量值的傳遞均需要通過主內存來完成。
這裏寫圖片描述
主內存與工作內存交互操作
Java內存模型中定義了以下8種操作來完成主內存與工作內存之間交互的實現細節:
Lock(鎖定):作用於主內存中的變量,它把一個變量標識爲一條線程獨佔的轉態。
Unlock(解鎖):作用於主內存中的變量,它把一個處於鎖定轉態的變量釋放出來,釋放後的變量纔可以被其他線程鎖定。
Read(讀取):作用於主內存中的變量,它把一個變量的值從主內存傳輸到工作內存中,以便隨後的Load動作使用。
Load(載入):作用於工作內存中的變量,它把read操作從主存中得到的變量值放入工作內存的變量副本中。
Use(使用):作用於工作內存的變量,它把工作內存中的一個變量的值傳遞給執行引擎,每當虛擬機遇到一個需要使用到變量的值得字節碼指令時將會執行這個操作。
Assign(賦值):作用於工作內存的變量,它把一個從執行引擎接收到的值賦給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。
Store(存儲):作用於工作內存的變量,它把工作內存中的一個變量的值傳遞到主內存中,以便隨後的write操作使用。
Write(寫入):作用於主內存中的變量,它把store操作從工作內存中得到的變量值放入主內存中的變量。
這裏寫圖片描述
**注意:
**執行上述8種基本操作必須滿足如下規則:
1、不允許read和load、store和write操作之一單獨出現,以上兩個操作必須按順序執行,但沒有保證必須連續執行,也就是說,read與load之間、store與write之間是可插入其他指令的。

2、不允許一個線程丟棄它的最近的assign操作,即變量在工作內存中改變了之後必須把該變化同步回主內存。

3、不允許一個線程無原因地(沒有發生過任何assign操作)把數據從線程的工作內存同步回主內存中。

4、一個新的變量只能從主內存中“誕生”,不允許在工作內存中直接使用一個未被初始化(load或assign)的變量,換句話說就是對一個變量實施use和store操作之前,必須先執行過了assign和load操作。

5、一個變量在同一個時刻只允許一條線程對其執行lock操作,但lock操作可以被同一個條線程重複執行多次,多次執行lock後,只有執行相同次數的unlock操作,變量纔會被解鎖。

6、如果對一個變量執行lock操作,將會清空工作內存中此變量的值,在執行引擎使用這個變量前,需要重新執行load或assign操作初始化變量的值。

7、如果一個變量實現沒有被lock操作鎖定,則不允許對它執行unlock操作,也不允許去unlock一個被其他線程鎖定的變量。

8、對一個變量執行unlock操作之前,必須先把此變量同步回主內存(執行store和write操作)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章