Java内存模型解析
一.java內(nèi)存模型的誕生原因以及作用
1.誕生原因
java虛擬機(jī)中規(guī)范定義的一種內(nèi)存模型,來屏蔽調(diào)各種硬件和操作系統(tǒng)之間的內(nèi)存訪問差異,為了實(shí)現(xiàn)java程序在各種平臺(tái)都能達(dá)到一致的內(nèi)存訪問效果。這是它誕生的緣由。
2.作用
其實(shí)這個(gè)內(nèi)存模型主要就是去定義程序中各個(gè)變量的訪問規(guī)則,即在虛擬機(jī)中將變量存儲(chǔ)到內(nèi)存和從內(nèi)存中取出來的底層細(xì)節(jié),這里的變量,是指實(shí)例字段,靜態(tài)字段,數(shù)組等,不包括局部變量和方法參數(shù)。
二.內(nèi)存模型概述
1.主內(nèi)存
所以的變量都存在主內(nèi)存,這里的內(nèi)存也就是虛擬機(jī)的內(nèi)存,就是虛擬機(jī)在運(yùn)行時(shí),系統(tǒng)分給虛擬機(jī)的內(nèi)存。
2.工作內(nèi)存
工作內(nèi)存保存了該線程使用到的變量的主內(nèi)存副本拷貝,線程對(duì)變量的操作必須在工作內(nèi)存內(nèi)進(jìn)行.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 3.內(nèi)存間的交互操作
lock(鎖定):作用于主內(nèi)存的變量,把一個(gè)變量標(biāo)識(shí)為一條線程獨(dú)占的狀態(tài)。
unlock(解鎖):釋放鎖定的變量,這時(shí)才可以被其他線程鎖定。
read(讀取):主內(nèi)存讀到工作內(nèi)存。
load(加載):把從主內(nèi)存中的獲取的變量放入工作內(nèi)存的變量副本中。
use(使用):把工作內(nèi)存的變量加載到執(zhí)行引擎,當(dāng)虛擬機(jī)遇到一個(gè)需要使用變量的字節(jié)碼的指令時(shí)會(huì)用到。
assign(賦值):執(zhí)行引擎到工作內(nèi)存。
store(存儲(chǔ)):工作內(nèi)存?zhèn)鞯街鲀?nèi)存。
write(寫入):把store傳入來的變量放在主內(nèi)存的變量里。
4.內(nèi)存交互操作的規(guī)則
? ? 1.read和load,store和write必須順序執(zhí)行,不一定連續(xù)執(zhí)行。
? ? 2.工作內(nèi)存assign了,值改變了,不能不同步會(huì)主內(nèi)存
3.沒有assign不能返回主內(nèi)存.
4.實(shí)施use,store之前,要執(zhí)行assign,和load
5.一個(gè)變量同一時(shí)刻只能允許一條線程對(duì)其進(jìn)行l(wèi)ock操作,但是lock可以被同一條線程執(zhí)行多次。
6.如果對(duì)一個(gè)變量進(jìn)行l(wèi)ock,那么就清空工作內(nèi)存的值,執(zhí)行引擎要使用時(shí)要重新load和assign(load和assign會(huì)引起變量的更新)。
7.變量沒有被lock,不能執(zhí)行unlock。
8.執(zhí)行unlock,要先store和write同步變量回主內(nèi)存。
轉(zhuǎn)載于:https://www.cnblogs.com/JimmyFanHome/p/9912394.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java内存模型解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle RAC切换归档
- 下一篇: Java集合---Arrays类源码解析