java并發(fā)編程(17):深入java內(nèi)存模型—內(nèi)存操作規(guī)則總結(jié)-編程開發(fā)技術(shù)

java并發(fā)編程(17):深入java內(nèi)存模型—內(nèi)存操作規(guī)則總結(jié)-編程開發(fā)技術(shù)

ID:30777833

大?。?7.96 KB

頁數(shù):4頁

時間:2019-01-03

java并發(fā)編程(17):深入java內(nèi)存模型—內(nèi)存操作規(guī)則總結(jié)-編程開發(fā)技術(shù)_第1頁
java并發(fā)編程(17):深入java內(nèi)存模型—內(nèi)存操作規(guī)則總結(jié)-編程開發(fā)技術(shù)_第2頁
java并發(fā)編程(17):深入java內(nèi)存模型—內(nèi)存操作規(guī)則總結(jié)-編程開發(fā)技術(shù)_第3頁
java并發(fā)編程(17):深入java內(nèi)存模型—內(nèi)存操作規(guī)則總結(jié)-編程開發(fā)技術(shù)_第4頁
資源描述:

《java并發(fā)編程(17):深入java內(nèi)存模型—內(nèi)存操作規(guī)則總結(jié)-編程開發(fā)技術(shù)》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。

1、Java并發(fā)編程(17):深入Java內(nèi)存模型一內(nèi)存操作規(guī)則總結(jié)-編程開發(fā)技術(shù)Java并發(fā)編程(17):深入Java內(nèi)存模型一內(nèi)存操作規(guī)則總結(jié)原文出處:蘭亭風雨主內(nèi)存與工作內(nèi)存Java內(nèi)存模型的主耍目標是定義程序中各個變量的訪問規(guī)則,即在虛擬機中將變量存儲到內(nèi)存和從內(nèi)存中取出變量這樣的底層細節(jié)。此處的變量主要是指共享變量,存在競爭問題的變量。Java內(nèi)存模型規(guī)定所有的變量都存儲在主內(nèi)存屮,而每條線程還有自己的工作內(nèi)存,線程的工作內(nèi)存屮保存了該線程使用到的變量的主內(nèi)存副木拷貝,線程對變量的所有操作(讀

2、取、賦值等)都必須在工作內(nèi)存中進行,而不能直接讀寫主內(nèi)存中的變量(根據(jù)Java虛擬機規(guī)范的規(guī)定,volatile變量依然有共享內(nèi)存的拷貝,但是由于它特殊的操作順序性規(guī)定一一從工作內(nèi)存小讀寫數(shù)據(jù)前,必須先將主內(nèi)存屮的數(shù)據(jù)同步到工作內(nèi)存屮,所有看起來如同直接在主內(nèi)存中讀寫訪問一般,因此這里的描述對于volatile也不例外)。不同線程Z間也無法直接訪問對方工作內(nèi)存中的變量,線程間變量值得傳遞均需耍通過主內(nèi)存來完成。內(nèi)存間交互操作Java內(nèi)存模型屮定義了以下8中操作來完成主內(nèi)存與工作內(nèi)存Z間交互的實現(xiàn)細節(jié)

3、:1、luck(鎖定):作用于主內(nèi)存的變量,它把一個變量標示為一條線程獨占的狀態(tài)。2、unlock(解鎖):作用于主內(nèi)存的變量,它把一個處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定。3、read(讀?。鹤饔糜谥鲀?nèi)存的變量,它把一個變量的值從主內(nèi)存?zhèn)鬏數(shù)焦ぷ鲀?nèi)存屮,以便隨后的load動作使用。4、load(載入):作用于工作內(nèi)存的變量,它把read操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本小。5、use(使用):作用丁作內(nèi)存的變量,它把工作內(nèi)存屮的一個變量的值傳遞給執(zhí)行引擎,每

4、當虛擬機遇到一個需要使用到變量的值得字節(jié)碼指令時將會執(zhí)行這個操作。6、assign(賦值):作用于工作內(nèi)存的變量,它把一個從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量,每當虛擬機遇到一個給變量賦值的字節(jié)碼指令時執(zhí)行這個操作。7、store(存儲):作用于工作內(nèi)存的變量,它把工作內(nèi)存中的一個變量的值傳遞到主內(nèi)存小,以便隨后的write操作使用。8、write(寫入):作用于主內(nèi)存的變量,它把store操作從工作內(nèi)存中得到的變量值放入主內(nèi)存的變量中。Java內(nèi)存模型述規(guī)定了執(zhí)行上述8種基木操作吋必須滿足如下規(guī)

5、則:1、不允許read和load、store和write操作之一單獨出現(xiàn),以上兩個操作必須按順序執(zhí)彳亍,但沒有保證必須連續(xù)執(zhí)彳亍,也就是說,read與loadZ間、store與write之間是可插入其他指令的。2、不允許一個線程丟棄它的最近的assign操作,即變量在工作內(nèi)存中改變了之后必須把該變化同步回主內(nèi)存。3、不允許一個線程無原因地(沒有發(fā)生過任何assign操作)把數(shù)據(jù)從線程的工作內(nèi)存同步回主內(nèi)存中。4、一個新的變量只能從主內(nèi)存中“誕生”,不允許在工作內(nèi)存中直接使用一個未被初始化(load或

6、assign)的變量,換句話說就是對一個變量實施use和store操作之前,必須先執(zhí)行過了assign和load操作。5>一個變量在同一個時刻只允許一條線程對其執(zhí)行Tock操作,但lock操作口J以被同一個條線程重復執(zhí)行多次,多次執(zhí)行l(wèi)ock后,只有執(zhí)行相同次數(shù)的unlock操作,變量才會被解鎖。6、如果對一個變量執(zhí)行l(wèi)ock操作,將會清空工作內(nèi)存中此變量的值,在執(zhí)行引擎使用這個變量前,需要重新執(zhí)行l(wèi)oad或assign操作初始化變量的值。7、如果一個變量實現(xiàn)沒有被lock操作鎖定,則不允許對它執(zhí)行

7、unlock操作,也不允許去unlock一個被其他線程鎖定的變量。8、對一個變量執(zhí)行unlock操作Z而,必須先把此變量同步回主內(nèi)存(執(zhí)行store和write操作)ovolatile型變量的特殊規(guī)則Java內(nèi)存模型對volatile專門定義了一些特殊的訪問規(guī)則,當一個變量被定義成volatileZ后,他將具備兩種特性:1、保證此變量對所冇線程的可見性。這里不具體解釋了。需要注意,volatile變量的寫操作除了對它本身的讀操作可見外,volat訂e寫操作之前的所有共享變量均對volatile讀操作

8、之后的操作可見,另外注意其適用場景,詳見http://blog.csdn.net/ns_code/article/detai1s/17290021和http://blog.csdn.nct/ns_codc/articlc/dctails/17101369這兩篇博文。2、禁止指令重排序優(yōu)化。普通的變量僅僅會保證在該方法的執(zhí)行過程屮所有依賴賦值結(jié)果的地方都能獲得止確的結(jié)果,而不能保證變量賦值操作的順序與程序中的執(zhí)行順序一致,在單線程中,我們是無法感知這一點的。補%:Jav

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。