Java內(nèi)存模型

簡介

Java虛擬機(jī)規(guī)范中試圖定義一種內(nèi)存模型,主要是用來屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異。Java內(nèi)存模型的目標(biāo)是定義程序中各個(gè)變量的訪問規(guī)則:如將變量存儲(chǔ)到內(nèi)存,或者從內(nèi)存讀取變量。這里所說的變量主要是實(shí)例字段、靜態(tài)字段構(gòu)成對(duì)象的元素,但不包括局部變量方法參數(shù),因?yàn)檫@些是線程私有的,不會(huì)存在資源競爭的問題。

模型圖

Java內(nèi)存模型劃分了工作內(nèi)存和主內(nèi)存,定義了一系列Java線程訪問內(nèi)存變量的規(guī)則,而Java線程是通過工作內(nèi)存來訪問主內(nèi)存的,從而得到Java內(nèi)存模型圖如下。

Java內(nèi)存模型圖.png

主內(nèi)存工作內(nèi)存之間存在具體的交互協(xié)議,這種協(xié)議規(guī)定了Java線程如何通過工作內(nèi)存從主內(nèi)存讀取變量,以及如何通過工作內(nèi)存將變量值寫入到主內(nèi)存的變量。這些操作需要通過以下一些原子操作來完成,下面分別做介紹。

lock(鎖):作用于主內(nèi)存的變量,將一個(gè)變量標(biāo)示為線程獨(dú)占的狀態(tài)。

unlock(解鎖):釋放處于鎖定狀態(tài)的變量,這樣,該變量就可以被其它線程訪問。

read(讀):作用于主內(nèi)存的變量,從主內(nèi)存中讀取變量到工作內(nèi)存,供read操作使用。

load(載入):作用于工作內(nèi)存的變量,把從主內(nèi)存read的變量放到工作內(nèi)存的變量副本中。

use(使用):作用于工作內(nèi)存的變量,把工作內(nèi)存的變量傳遞給執(zhí)行引擎。

assign(賦值):作用于工作內(nèi)存的變量,把從執(zhí)行引擎獲得的值賦給工作內(nèi)存的變量。

store(存儲(chǔ)):作用于工作內(nèi)存的變量,把工作內(nèi)存的變量傳遞到主內(nèi)存中,供write操作使用。

write(寫):作用于主內(nèi)存的變量,把從工作內(nèi)存store的變量寫到主內(nèi)存中。

說明:
1.read和load操作、store和write操作是成對(duì)出現(xiàn)的,即:不允許從主內(nèi)存讀取變量,而工作內(nèi)存不接受;或者工作內(nèi)存發(fā)起了寫回操作,而主內(nèi)存不接受。
2.對(duì)一個(gè)變量進(jìn)行unlock操作之前,必須將該變量同步到主內(nèi)存中。
附:上面在講Java內(nèi)存模型時(shí),說到了執(zhí)行引擎,執(zhí)行引擎是用來處理字節(jié)碼的,其處理過程:輸入字節(jié)碼,解析字節(jié)碼,輸出執(zhí)行結(jié)果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容