前言:Java內(nèi)存模型簡稱JMM(Java Memory Model)
由來
JMM的設(shè)計主要是為了屏蔽各種硬件和操作系統(tǒng)的內(nèi)存訪問差異粉怕,以實(shí)現(xiàn)讓Java程序在各種平臺下都能達(dá)到一直的內(nèi)存訪問效果。它主要的目標(biāo)就是定義程序中各個變量的訪問規(guī)則檐嚣。
分類
JMM主要分為主內(nèi)存(Main Memory) 和工作內(nèi)存(Working Memory)
1.所有的變量的都存儲在主內(nèi)存;
2.每條線程都有自己的工作線程庭敦,工作線程保存了被該線程使用到的變量的主內(nèi)存的副本拷貝厌丑;
3.線程對變量的所有操作(讀取/賦值)等操作都是在工作線程中完成的,而不能直接讀取主內(nèi)存中的數(shù)據(jù)辈双。
4.不同線程之間也無法訪問訪問對方的工作線程中的變量,線程之間的數(shù)據(jù)的傳遞都是通過主內(nèi)存完成的柜砾。
5.他們的關(guān)系圖如下所示:
注:這里所說的內(nèi)存劃分和Java內(nèi)存區(qū)域中的堆/棧/方法去等并不是統(tǒng)一層次的劃分湃望,兩者基本上沒有關(guān)系的。
內(nèi)存間的交互
我們上面也說了痰驱,線程之間是沒辦法訪問证芭,所以我們主要的交互就是:
1.怎么將工作內(nèi)存的數(shù)據(jù)同步到主內(nèi)存中?
2.怎么將主內(nèi)存的數(shù)據(jù)拷貝到工作線程中担映?
以下是Java內(nèi)存中定義的8種操作(在最新的文檔中已棄用废士,所以這里只是稍微提一下):
1.lock(鎖定):作用于主內(nèi)存變量,他把一個變量標(biāo)記為一個線程獨(dú)占的狀態(tài)另萤;
2.unlock(解鎖):作用于主內(nèi)存變量湃密,他將一個鎖定的變量釋放出來;
3.read(讀取):作用于主內(nèi)存變量四敞,他將一個變量從主內(nèi)存中傳輸?shù)焦ぷ鲀?nèi)存中泛源;
4.load(載入):作用于工作內(nèi)存變量,他將從主內(nèi)存得到的變量放入到工作內(nèi)存的變量副本中
5.use(使用):作用于工作變量忿危,他將變量交給執(zhí)行引擎达箍;
6.assign(賦值):作用于工作內(nèi)存變量,他將執(zhí)行引擎返回的數(shù)據(jù)賦值給工作內(nèi)存中的變量铺厨;
7.store(存儲):作用于工作內(nèi)存變量缎玫,他將工作內(nèi)存的變量傳給主內(nèi)存硬纤;
8.write(寫入):作用于主內(nèi)存變量,他將從工作內(nèi)存中獲取的變量回寫到主內(nèi)存中赃磨;
待續(xù)
還沒總結(jié)完筝家,會繼續(xù)更新... (因?yàn)樽约簩@塊了解的比較少,也是邊學(xué)習(xí)邊更新)