本篇內(nèi)容主要講解“Java內(nèi)存模型的主內(nèi)存與工作內(nèi)存交互分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java內(nèi)存模型的主內(nèi)存與工作內(nèi)存交互分析”吧!
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),葉城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:葉城等地區(qū)。葉城做網(wǎng)站價(jià)格咨詢:18982081108
1、變量
Java內(nèi)存模型的主要目標(biāo)是定義程序中各個(gè)變量(非局部變量與方法參數(shù))的訪問規(guī)則 ,即在虛擬機(jī)中將變量存儲到內(nèi)存和從內(nèi)存中取出變量這樣的底層細(xì)節(jié)。
此處的變量與Java編程中所說的變量有所區(qū)別,它包括了實(shí)例字段、靜態(tài)字段和構(gòu)成數(shù)組對象的元素,但不包括局部變量與方法參數(shù),因?yàn)檫@些是線程私有的,不會被共享,自然就不存在競爭問題。為了獲得較好的執(zhí)行效能,Java內(nèi)存模型并沒有限制執(zhí)行引擎使用處理器的特定寄存器或者緩存來和主內(nèi)存進(jìn)行交互,也沒有限制即使編譯器進(jìn)行調(diào)整代碼執(zhí)行順序這類優(yōu)化措施。
2、討論層次
本文說的主內(nèi)存、工作內(nèi)存與Java內(nèi)存區(qū)域中的Java堆、棧、方法區(qū)等并不是同一個(gè)層次的內(nèi)存劃分,這兩者基本沒有關(guān)系;
如果一定要勉強(qiáng)對應(yīng)起來,那從變量、主內(nèi)存、工作內(nèi)存的定義來看,主內(nèi)存主要對應(yīng)Java堆中的對象實(shí)例數(shù)據(jù)那部分,而工作內(nèi)存則對應(yīng)于虛擬機(jī)棧中的部分區(qū)域。
從更低層次上說,主內(nèi)存就直接對應(yīng)于物理硬件的內(nèi)存,而為了獲取更好的運(yùn)行速度,虛擬機(jī)可能會讓工作內(nèi)存優(yōu)先存儲于寄存器和高速緩存中,因?yàn)槌绦蜻\(yùn)行時(shí)主要訪問讀寫的是工作內(nèi)存。
1、Java內(nèi)存模型規(guī)定了所有的變量都存儲在主內(nèi)存中;
2、每條線程還有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了被該線程使用到的變量的主內(nèi)存副本拷貝,線程對變量的所有操作(讀取、賦值等)都必須在工作內(nèi)存中進(jìn)行,而不能直接讀寫主內(nèi)存中的變量。不同的線程之間也無法直接訪問對方工作內(nèi)存中的變量,線程間變量的值的傳遞均需要通過主內(nèi)存來完成。
關(guān)于主內(nèi)存與工作內(nèi)存之間具體的交互協(xié)議,即一個(gè)變量如何從主內(nèi)存拷貝到工作內(nèi)存、如何從工作內(nèi)存同步回主內(nèi)存之類的實(shí)現(xiàn)細(xì)節(jié),Java內(nèi)存模型中定義了以下8種操作來完成,虛擬機(jī)實(shí)現(xiàn)時(shí)必須保證下面提及的每一種操作都是原子的、不可再分的。
lock(鎖定):作用于主內(nèi)存變量,它把一個(gè)變量標(biāo)識為一條線程獨(dú)占的狀態(tài)
unlock(解鎖):作用于主內(nèi)存的變量,它把一個(gè)處于鎖定狀態(tà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í)將會執(zhí)行這個(gè)操作
assign(賦值):作用于工作內(nèi)存的變量,它把一個(gè)從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個(gè)給變量賦值的字節(jié)碼指令時(shí)執(zhí)行這個(gè)操作
store(存儲):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的write操作使用
write(寫入):作用于主內(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í)行,并沒有保證是連續(xù)執(zhí)行,也就是說read和load之間、store和write之間是可插入其他指令的。
到此,相信大家對“Java內(nèi)存模型的主內(nèi)存與工作內(nèi)存交互分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
當(dāng)前名稱:Java內(nèi)存模型的主內(nèi)存與工作內(nèi)存交互分析
本文網(wǎng)址:http://m.rwnh.cn/article6/gspjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、靜態(tài)網(wǎng)站、網(wǎng)站排名、搜索引擎優(yōu)化、網(wǎng)站收錄、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)