JVM學習記錄-Java內存模型(一)
前言
Java虛擬機規范中定義了一種Java的內存模型,即Java Memoory Model(簡稱JMM),用來實現讓Java程序在各個平臺下都能達到一致的內存訪問效果。JVM是整個虛擬機,JMM模型屬于JVM的一部分。
定義Java內存模型并不是一件容易的事情,即要足夠嚴謹,又要足夠寬松。初始的Java內存模型并不完善,經過不斷的改善,到JDK1.5后才逐漸的成熟和完善起來。
主內存與工作內存
Java內存模型的主要目標是定義程序中各個變量的訪問規則,此處的變量與Java編程中所說的變量有所區別,它包括了實例字段、靜態字段和構成數組對象的元素,但不包含局部變量與方法參數,因為后者是線程私有的。
Java內存模型規定了所有的變量都存儲在主內存(虛擬機內存的一部分)中,每條線程還有自己的工作內存,線程的工作內存中保存了被該線程使用到的共享變量的主內存副本拷貝,線程對變量的所有操作(讀取、賦值等)都必須在工作內存中進行,不能直接讀寫主內存中的變量。線程間的變量值傳遞等操作均需要通過主內存來完成。
線程、工作內存、主內存三者的交互關系如圖:

一個變量如何從主內存拷貝到工作內存、如何從工作內存同步會主內存的實現細節,在Java內存模型中定義了以下8種操作來完成,虛擬機實現時必須保證下面的每一個操作都是原子的,不可再分的。

變量從主內存復制到工作內存:順序執行read和load操作。
變量從工作內存同步回主內存:順序的執行store和write操作。
Java內存模型還規定了在執行上述8種基本操作時必須滿足如下嚴格的規則:
- 不允許read和load、store和write操作之一單獨出現。
- 不允許一個線程丟棄它的最近的assign操作(在線程中改變了變量必須同步回主內存)。
- 不允許一個線程無原因地把數據從線程的工作內存同步回主內存。
- 一個新的變量只能從主內存中“誕生”,不允許在工作內存中直接使用一個未被初始化的變量。
- 一個變量在同一時刻只允許一條線程對其進行lock操作,但可以在一條線程中重復多次lock一個變量,但unlock時也必須重復相應的次數。
- 如果一個變量執行lock操作,那將會清空工作內存中此變量的值,在執行引擎是用這個變量前,需要觀眾席執行load或assign操作初始化變量的值。
- 如果一個變量事先沒有被lock操作鎖定,那就不允許對它執行unlock操作。
- 對一個變量執行unlock操作之前,必須先把此變量同步回主內存中(執行store、write操作)。
作者:紀莫
歡迎任何形式的轉載,但請務必注明出處。
限于本人水平,如果文章和代碼有表述不當之處,還請不吝賜教。
歡迎掃描二維碼關注公眾號:Jimoer
文章會同步到公眾號上面,大家一起成長,共同提升技術能力。
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。
您的鼓勵是博主的最大動力!


浙公網安備 33010602011771號