Java內(nèi)存模型

      網(wǎng)友投稿 633 2022-05-30

      java的后端服務器開發(fā)中"高效并發(fā)"是我們經(jīng)常會碰到的,而要寫出高效的代碼需要更多的積累與實踐。而一些基礎的內(nèi)容是往這個方向發(fā)展的基石。所以我們就來介紹下。

      硬件效率的一致性

      隨著硬件技術(shù)的發(fā)展,處理器的處理能力越來越強大,但是與處理器交互的內(nèi)存的處理能力并沒有提升多少,讀取運算,存儲運算這些IO操作的瓶頸并沒有得以消除,處理器的處理效率比內(nèi)存的處理效率要高好幾個數(shù)量級,在這種情況下在處理器和內(nèi)存之間添加了一個高速緩存用以平衡相互關系,也就是將內(nèi)存中的數(shù)據(jù)先保存到高速緩存中,處理器處理數(shù)據(jù)的時候直接從緩存中獲取,處理完成后再從緩存中將數(shù)據(jù)同步回內(nèi)存中。這樣既不會拖累處理器,也能很好的從內(nèi)存中操作數(shù)據(jù)。關系圖如下:

      引入高速緩存解決了處理器和內(nèi)存的矛盾,但同時又產(chǎn)生了一個新的問題:緩存一致性,在多處理器的系統(tǒng)中,每個處理器都有自己的高速緩存,而他們又都共享同一主內(nèi)存。當多個處理器的運算任務都涉及到同一塊主內(nèi)存區(qū)域時,將可能導致各自緩存數(shù)據(jù)的不一致。為了解決一致性問題,需要各個處理器訪問緩存時都遵循一些協(xié)議。在讀寫時根據(jù)協(xié)議來操作。這里講的"內(nèi)存模型"可以理解為在特定操作協(xié)議下對特定的內(nèi)存或高速緩存進行讀寫訪問的過程抽象。java虛擬機也有自己的內(nèi)存模型,接下來我們看下。

      Java內(nèi)存模型

      java的內(nèi)存模型規(guī)定所有的變量都存儲在主內(nèi)存中,每條線程都有自己的工作內(nèi)存(類比上面的高速緩存)。線程的工作內(nèi)存中保存了該線程使用的變量的主內(nèi)存副本拷貝。線程對變量的所有操作(讀取,賦值)都必須在工作內(nèi)存中進行。而不能直接讀寫主內(nèi)存中的變量,不同線程之間也無法直接訪問對方工作內(nèi)存中的變量。線程間變量的傳遞均需要通過主內(nèi)存來完成。如下圖

      內(nèi)存交互操作

      主內(nèi)存和工作內(nèi)存之間具體的交互協(xié)議通過以下8個操作來完成。

      將一個變量從主內(nèi)存中復制到工作內(nèi)存中,需要順序的執(zhí)行read和load操作。

      如果要將變量從工作內(nèi)存中同步會主內(nèi)存,就要順序的執(zhí)行store和write操作如下。

      內(nèi)存模型要求上述兩個操作必須按順序執(zhí)行,但不是連續(xù),也就是說read和load之間、store和write之間可插入其他指令。可以出現(xiàn) read a,read b,load a,load b的情況,java內(nèi)存模型還要求了如下的規(guī)則,必須準守。

      不允許read和load、store和write操作之一單獨出現(xiàn),即不允許一個變量從主內(nèi)存讀取了但工作內(nèi)存不接受或者從工作內(nèi)存發(fā)起回寫但主內(nèi)存不接受的情況。

      不允許一個線程丟棄它的最近的assign操作。即變量在工作內(nèi)存中改變了之后必須把變化同步會主內(nèi)存。

      Java的內(nèi)存模型

      不允許一個線程無原因滴(沒有發(fā)生任何assign操作)把數(shù)據(jù)從線程的工作內(nèi)存同步會主內(nèi)存中。

      一個新的變量只能在主內(nèi)存中“誕生”,不允許在工作內(nèi)存中直接使用一個未被初始化的變量。換句話說就是在對一個變量use、store操作之前必須先執(zhí)行過了assign和load操作

      一個變量在同一時刻只允許一條線程對其進行l(wèi)ock操作,但lock操作可以被同一條線程重復執(zhí)行多次,多次執(zhí)行l(wèi)ock后,只要執(zhí)行相同次數(shù)的unlock操作,變量才會被解鎖。

      如果對一個變量執(zhí)行l(wèi)ock操作,將會清空工作內(nèi)存中此變量的值,在執(zhí)行引擎是喲歐這個變量之前需要重新執(zhí)行l(wèi)oad或者assign操作初始化變量的值。

      如果一個變量沒有被lock操作鎖定,那么就不允許對它執(zhí)行unlock操作,也不允許去unlock一個被其他線程鎖定住的變量。

      對一個變量執(zhí)行unlock操作之前,必須先把此變量同步回主內(nèi)存中(store,write操作)

      以上八條就是Java內(nèi)存模型的操作規(guī)則。

      參考《深入理解Java虛擬機》

      Java 任務調(diào)度

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:【沃土方案--制造業(yè)】長春啟璞科技信息咨詢有限公司-數(shù)字化運營管理平臺
      下一篇:華為云IoT,億級接入,鴻蒙加持【玩轉(zhuǎn)華為云】
      相關文章
      国产成人亚洲综合无码精品 | 亚洲美女视频一区二区三区| 久久久久亚洲av毛片大| mm1313亚洲国产精品美女| 久久亚洲精品成人无码| 亚洲av无码一区二区三区四区| 亚洲国产综合AV在线观看| 亚洲乱码在线观看| 国产亚洲中文日本不卡二区| 亚洲成a人片在线看| 亚洲天堂2016| 亚洲色在线无码国产精品不卡| 亚洲日韩国产二区无码| 亚洲精品无码aⅴ中文字幕蜜桃| 亚洲乱理伦片在线观看中字| 亚洲AV无码国产精品永久一区| WWW国产亚洲精品久久麻豆| 内射无码专区久久亚洲| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 精品亚洲成在人线AV无码| 亚洲欧洲另类春色校园网站| 91在线亚洲综合在线| 亚洲国产aⅴ成人精品无吗| 在线91精品亚洲网站精品成人| 亚洲 小说区 图片区 都市| 亚洲午夜精品久久久久久浪潮| 国产gv天堂亚洲国产gv刚刚碰| 亚洲啪啪AV无码片| 亚洲日本中文字幕区| 亚洲毛片免费观看| 色老板亚洲视频免在线观| 亚洲老熟女五十路老熟女bbw| 日韩国产欧美亚洲v片| 亚洲国产综合精品中文字幕| 亚洲日韩小电影在线观看| 亚洲国产人成网站在线电影动漫| 亚洲激情电影在线| 亚洲国产精品成人午夜在线观看| 亚洲国产精品日韩| 亚洲av日韩av高潮潮喷无码| 亚洲欧洲国产精品久久|