您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Java內(nèi)存模型的主內(nèi)存與工作內(nèi)存交互分析”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java內(nèi)存模型的主內(nèi)存與工作內(nèi)存交互分析”吧!
1、變量
Java內(nèi)存模型的主要目標(biāo)是定義程序中各個(gè)變量(非局部變量與方法參數(shù))的訪問(wèn)規(guī)則 ,即在虛擬機(jī)中將變量存儲(chǔ)到內(nèi)存和從內(nèi)存中取出變量這樣的底層細(xì)節(jié)。
此處的變量與Java編程中所說(shuō)的變量有所區(qū)別,它包括了實(shí)例字段、靜態(tài)字段和構(gòu)成數(shù)組對(duì)象的元素,但不包括局部變量與方法參數(shù),因?yàn)檫@些是線程私有的,不會(huì)被共享,自然就不存在競(jìng)爭(zhēng)問(wèn)題。為了獲得較好的執(zhí)行效能,Java內(nèi)存模型并沒(méi)有限制執(zhí)行引擎使用處理器的特定寄存器或者緩存來(lái)和主內(nèi)存進(jìn)行交互,也沒(méi)有限制即使編譯器進(jìn)行調(diào)整代碼執(zhí)行順序這類(lèi)優(yōu)化措施。
2、討論層次
本文說(shuō)的主內(nèi)存、工作內(nèi)存與Java內(nèi)存區(qū)域中的Java堆、棧、方法區(qū)等并不是同一個(gè)層次的內(nèi)存劃分,這兩者基本沒(méi)有關(guān)系;
如果一定要勉強(qiáng)對(duì)應(yīng)起來(lái),那從變量、主內(nèi)存、工作內(nèi)存的定義來(lái)看,主內(nèi)存主要對(duì)應(yīng)Java堆中的對(duì)象實(shí)例數(shù)據(jù)那部分,而工作內(nèi)存則對(duì)應(yīng)于虛擬機(jī)棧中的部分區(qū)域。
從更低層次上說(shuō),主內(nèi)存就直接對(duì)應(yīng)于物理硬件的內(nèi)存,而為了獲取更好的運(yùn)行速度,虛擬機(jī)可能會(huì)讓工作內(nèi)存優(yōu)先存儲(chǔ)于寄存器和高速緩存中,因?yàn)槌绦蜻\(yùn)行時(shí)主要訪問(wèn)讀寫(xiě)的是工作內(nèi)存。
1、Java內(nèi)存模型規(guī)定了所有的變量都存儲(chǔ)在主內(nèi)存中;
2、每條線程還有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了被該線程使用到的變量的主內(nèi)存副本拷貝,線程對(duì)變量的所有操作(讀取、賦值等)都必須在工作內(nèi)存中進(jìn)行,而不能直接讀寫(xiě)主內(nèi)存中的變量。不同的線程之間也無(wú)法直接訪問(wèn)對(duì)方工作內(nèi)存中的變量,線程間變量的值的傳遞均需要通過(guò)主內(nèi)存來(lái)完成。
關(guān)于主內(nèi)存與工作內(nèi)存之間具體的交互協(xié)議,即一個(gè)變量如何從主內(nèi)存拷貝到工作內(nèi)存、如何從工作內(nèi)存同步回主內(nèi)存之類(lèi)的實(shí)現(xiàn)細(xì)節(jié),Java內(nèi)存模型中定義了以下8種操作來(lái)完成,虛擬機(jī)實(shí)現(xiàn)時(shí)必須保證下面提及的每一種操作都是原子的、不可再分的。
lock(鎖定):作用于主內(nèi)存變量,它把一個(gè)變量標(biāo)識(shí)為一條線程獨(dú)占的狀態(tài)
unlock(解鎖):作用于主內(nèi)存的變量,它把一個(gè)處于鎖定狀態(tài)的變量釋放出來(lái),釋放后的變量才可以被其它線程鎖定
read(讀取):作用于主內(nèi)存的變量,它把一個(gè)變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的load動(dòng)作使用
load(載入):作用于工作內(nèi)存的變量,它把read操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中
use(使用):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個(gè)變量的值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個(gè)需要使用到變量的值的字節(jié)碼指令時(shí)將會(huì)執(zhí)行這個(gè)操作
assign(賦值):作用于工作內(nèi)存的變量,它把一個(gè)從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個(gè)給變量賦值的字節(jié)碼指令時(shí)執(zhí)行這個(gè)操作
store(存儲(chǔ)):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的write操作使用
write(寫(xiě)入):作用于主內(nèi)存的變量,它把store操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中
如果要把一個(gè)變量從主內(nèi)存復(fù)制到工作內(nèi)存,那就要順序地執(zhí)行read和load操作;如果要把變量從工作內(nèi)存同步回主內(nèi)存,就要順序地執(zhí)行store和write操作。需要注意的是Java內(nèi)存模型只要求上述兩個(gè)操作必須按順序執(zhí)行,并沒(méi)有保證是連續(xù)執(zhí)行,也就是說(shuō)read和load之間、store和write之間是可插入其他指令的。
到此,相信大家對(duì)“Java內(nèi)存模型的主內(nèi)存與工作內(nèi)存交互分析”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。