簡介
Java虛擬機規范中試圖定義一種內存模型,主要是用來屏蔽掉各種硬件和操作系統的內存訪問差異。Java內存模型的目標是定義程序中各個變量的訪問規則:如將變量存儲到內存,或者從內存讀取變量。這里所說的變量主要是實例字段、靜態字段和構成對象的元素,但不包括局部變量和方法參數,因為這些是線程私有的,不會存在資源競爭的問題。
模型圖
Java內存模型劃分了工作內存和主內存,定義了一系列Java線程訪問內存變量的規則,而Java線程是通過工作內存來訪問主內存的,從而得到Java內存模型圖如下。
Java內存模型圖.png
主內存與工作內存之間存在具體的交互協議,這種協議規定了Java線程如何通過工作內存從主內存讀取變量,以及如何通過工作內存將變量值寫入到主內存的變量。這些操作需要通過以下一些原子操作來完成,下面分別做介紹。
lock(鎖):作用于主內存的變量,將一個變量標示為線程獨占的狀態。
unlock(解鎖):釋放處于鎖定狀態的變量,這樣,該變量就可以被其它線程訪問。
read(讀):作用于主內存的變量,從主內存中讀取變量到工作內存,供read操作使用。
load(載入):作用于工作內存的變量,把從主內存read的變量放到工作內存的變量副本中。
use(使用):作用于工作內存的變量,把工作內存的變量傳遞給執行引擎。
assign(賦值):作用于工作內存的變量,把從執行引擎獲得的值賦給工作內存的變量。
store(存儲):作用于工作內存的變量,把工作內存的變量傳遞到主內存中,供write操作使用。
write(寫):作用于主內存的變量,把從工作內存store的變量寫到主內存中。
說明:
1.read和load操作、store和write操作是成對出現的,即:不允許從主內存讀取變量,而工作內存不接受;或者工作內存發起了寫回操作,而主內存不接受。
2.對一個變量進行unlock操作之前,必須將該變量同步到主內存中。
附:上面在講Java內存模型時,說到了執行引擎,執行引擎是用來處理字節碼的,其處理過程:輸入字節碼,解析字節碼,輸出執行結果。