![硬件內(nèi)存模型到 Java 內(nèi)存模型,這些硬核知識(shí)你知多少_第1頁](http://file4.renrendoc.com/view/8b7a89289fc80509271a678735965be4/8b7a89289fc80509271a678735965be41.gif)
![硬件內(nèi)存模型到 Java 內(nèi)存模型,這些硬核知識(shí)你知多少_第2頁](http://file4.renrendoc.com/view/8b7a89289fc80509271a678735965be4/8b7a89289fc80509271a678735965be42.gif)
![硬件內(nèi)存模型到 Java 內(nèi)存模型,這些硬核知識(shí)你知多少_第3頁](http://file4.renrendoc.com/view/8b7a89289fc80509271a678735965be4/8b7a89289fc80509271a678735965be43.gif)
![硬件內(nèi)存模型到 Java 內(nèi)存模型,這些硬核知識(shí)你知多少_第4頁](http://file4.renrendoc.com/view/8b7a89289fc80509271a678735965be4/8b7a89289fc80509271a678735965be44.gif)
![硬件內(nèi)存模型到 Java 內(nèi)存模型,這些硬核知識(shí)你知多少_第5頁](http://file4.renrendoc.com/view/8b7a89289fc80509271a678735965be4/8b7a89289fc80509271a678735965be45.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Java內(nèi)存模型跟上篇JVM內(nèi)存結(jié)構(gòu)很像經(jīng)常會(huì)把他搞混其它們不是一回事,而相差還很大的,希望沒它們搞混,特別是在試的時(shí)候,搞了的話就會(huì)答非問,影響你的面試成,當(dāng)然也許你碰到了半子面試官,那要恭喜你了Java內(nèi)模型比JVM內(nèi)存結(jié)構(gòu)復(fù)雜多Java內(nèi)存模型有一個(gè)規(guī)范叫:《JSR:Java內(nèi)模型與線程規(guī)范》,面的內(nèi)容很豐富,如果沒看過的話我議你看一下今天我們就單來聊一聊Java內(nèi)存模型關(guān)于Java內(nèi)存模型,我還是先從硬件內(nèi)存模入手。硬件內(nèi)模型先來看看硬件存簡單架構(gòu),如下圖示:硬件內(nèi)存結(jié)構(gòu)這是一幅簡單硬件內(nèi)存結(jié)構(gòu)圖實(shí)的結(jié)構(gòu)圖要比這復(fù)雜多別是在緩存層現(xiàn)在的計(jì)算機(jī)緩一般有三層你可以打開你的電腦看看開任資源管理器--->性能--->cpu,下圖所示:CPU緩存從圖中可以看我這臺(tái)機(jī)器的CPU有三級(jí)緩存級(jí)緩存級(jí)L2三級(jí)緩存(L3)一級(jí)緩存是最接近CPU的三級(jí)緩存是最接近內(nèi)存,每一級(jí)緩存的數(shù)據(jù)都下一級(jí)緩存的一部分三級(jí)緩存架構(gòu)如下圖所:圖片來源網(wǎng)絡(luò)現(xiàn)在我們對(duì)硬內(nèi)存架構(gòu)有了一定的解,我們來弄明白一個(gè)題什需要CPU內(nèi)存間加緩?關(guān)于這個(gè)問題們就簡單點(diǎn)說,我們道是高速,而內(nèi)存相對(duì)來說是低的,這就會(huì)造一個(gè)問題,不能充分利用CPU高的特點(diǎn),因?yàn)镃PU每從內(nèi)存里獲取數(shù)的話都需要等待,這就浪費(fèi)了CPU高的能,緩存的出現(xiàn)就是用來消除CPU與存之間差距的。緩存的度要大于內(nèi)存于CPU,入緩存之后CPU直接從緩中讀取數(shù)據(jù)因?yàn)榫彺孢€比較快的所以這樣就充分利用了CPU高速的特。但也不是每次都從緩存中讀取到數(shù)據(jù)這個(gè)跟我們項(xiàng)目
中使用的redis等緩存工具一樣存在一個(gè)緩存命中率中先查找L1Cache,如果L1沒命中,就往L2里續(xù)找,依此類推,后沒找到的話直接內(nèi)存中取后添加到緩存然CPU需寫數(shù)據(jù)到主存時(shí),同樣會(huì)先刷新存器中的數(shù)據(jù)到CPU緩,然后再把數(shù)據(jù)刷新到內(nèi)存中。也許你已經(jīng)看了這個(gè)框架的弊端,單核時(shí)代只有一個(gè)處理核心,寫作全都是由單核成,沒什么問題;但多核架構(gòu),一個(gè)核修改存后,其他核并不知道數(shù)據(jù)已失效,繼續(xù)傻傻的使主存或者自己緩存層的據(jù),那么就會(huì)致數(shù)據(jù)不一致的況。關(guān)于這個(gè)問題硬廠商也提供了解決辦法,做存一致協(xié)(MESI協(xié))緩存一致性協(xié)議東西我也不了解,我也不清,所以就不在這里了有興趣的可以自行研。聊完了硬件內(nèi)架構(gòu),我們將焦點(diǎn)回我們的主題Java內(nèi)模型上,面就一起來聊一聊Java內(nèi)存模型。Java內(nèi)存模型Java內(nèi)存模型是什?Java內(nèi)存??梢岳斫鉃樽裾斩嗪思軜?gòu)的設(shè)計(jì),用Java實(shí)現(xiàn)了一套層的“緩存一性”樣就可以避CPU硬件廠商標(biāo)準(zhǔn)不一樣帶來風(fēng)險(xiǎn)了式介紹一下內(nèi)模Java內(nèi)存模型(JavaMemory,簡稱JMM),本身是種抽象的概念,并不是像硬件架構(gòu)一樣真實(shí)存在的,它描的是一組規(guī)則或規(guī)范通過這組規(guī)范定義了程中各個(gè)變量包實(shí)例字段、靜字段和構(gòu)成數(shù)組對(duì)象元素)的訪問方式更多關(guān)于Java內(nèi)存模型知識(shí)可以閱JSR133:Java內(nèi)存模與線程規(guī)范。我們知道JVM運(yùn)程的實(shí)體是線程,在上一JVM內(nèi)存結(jié)構(gòu)中我們得知每個(gè)線程創(chuàng)建時(shí)JVM都為其創(chuàng)建一個(gè)工作存(Java棧),用于存儲(chǔ)線程私有數(shù)據(jù),而Java內(nèi)存模型規(guī)定所有變量都存儲(chǔ)在主存主內(nèi)存是共享內(nèi)存區(qū)域所有線程都可訪問,但線程對(duì)變量操作(讀賦值等)必在工作內(nèi)存中進(jìn)行,首先要將量從主內(nèi)存拷貝到自的工作內(nèi)存空間,然后變量進(jìn)行操作操作完后再將變寫回主內(nèi)存,不能直操作主內(nèi)存中的變量。我們知道Java棧是每個(gè)線程私有的數(shù)據(jù)區(qū)域,別的線無訪問到不同線程的私有數(shù)據(jù)所線程需要通信的話必須通過主內(nèi)存來完成Java內(nèi)存模型就是夾在這兩者之間一組規(guī)范,我們先來看這個(gè)抽象架構(gòu)圖:圖片來源網(wǎng)絡(luò)
從結(jié)構(gòu)圖來看如果線程A與線程之間需要通的話,必須要經(jīng)歷下面2個(gè)步驟:1.首先,線程A把本地內(nèi)存A中的共享變量副本中的值刷新到主內(nèi)存中去。2.
然后,線程B到主內(nèi)存中去讀取線程A更新之后的值,這樣線程A中的變量值就到了線程B中。我們來看一個(gè)體的例子來加深一下解,看下面這張圖:圖片來源網(wǎng)絡(luò)現(xiàn)在線程需和程B通信,我們已知線程之間通信的兩部曲了假初始時(shí),這三個(gè)存中的x值都為0。線程在行時(shí),把更新后的x值(假設(shè)值為)臨時(shí)放在自己的本地內(nèi)存A中。當(dāng)線A和線程B需要通信時(shí),線程首會(huì)自己本地內(nèi)存中修改后x值刷新到主內(nèi)存中,此時(shí)內(nèi)存中的x值變?yōu)榱?后程B到內(nèi)存中去讀線程A更新后的x值時(shí)線程B的本地內(nèi)存的x值也變?yōu)榱?,這樣完成了一次通信。JMM通過控主內(nèi)存與每個(gè)線程的本內(nèi)存之間的交,來為Java程序員提供內(nèi)存可見性保Java內(nèi)模型除了定義了一套范還提供了一系列原語封裝了底層實(shí)現(xiàn)后供開發(fā)者直接使用。套實(shí)現(xiàn)也就是我們常用、、
等。Happens-Before內(nèi)存模Happens-Before內(nèi)存模型或許叫做Happens-Before原更合適,在《JSR133:Java內(nèi)存模型與程規(guī)范》中Happens-Before內(nèi)存模型被定成Java內(nèi)存模型近似型原則要說明的是于可見性的一組偏序關(guān)。為了方便程序開發(fā),將底層的繁瑣節(jié)屏蔽掉,Java內(nèi)存模型定義了Happens-Before原則我們理解了Happens-Before原了JVM底層的內(nèi)存操作就可以解決在并發(fā)編中遇到的變量可見性問。JVM定義的Happens-Before原則是一組偏序關(guān)系:于個(gè)作AB,兩操作以在同線程執(zhí)。如Happens-BeforeB,么以保,A操作行后A操作執(zhí)結(jié)對(duì)B操是見的。Happens-Before原則一共包括8條面?zhèn)円黄鸷唵蔚膶W(xué)習(xí)一下8條規(guī)則。1程序順序規(guī)
這條規(guī)則是指一個(gè)線程中,按照程順序,前面的操作Happens-Before于后續(xù)的任意操作。一條規(guī)則還是非常好解的,看下面這一段代class12345
int;int;publicrun(){y=x=}}第四行代碼要Happens-Before于第五行代,也就是按照代碼的順來。2鎖定規(guī)則這條規(guī)則是指一個(gè)鎖的解鎖Happens-Before于后續(xù)對(duì)這個(gè)鎖的加鎖例下面的代碼,在進(jìn)同步塊之前,會(huì)自動(dòng)鎖,而在代碼塊執(zhí)行完自動(dòng)釋放鎖,鎖以及釋放鎖都編譯器幫我們實(shí)現(xiàn)的synchronized){////xifthis.x<12{this.x=;}}對(duì)于鎖定規(guī)則以這樣理解:假設(shè)x的初始值是10,線執(zhí)行完代碼塊后x的值會(huì)變成12(執(zhí)行完自動(dòng)釋放鎖程B進(jìn)代碼塊時(shí)夠看到線程對(duì)x的寫操作,也就是線B能看到。3volatile變量規(guī)這條規(guī)則是指一個(gè)volatile變的寫操作及這個(gè)寫操作之的有操作Happens-Before對(duì)這個(gè)變量的讀操作及這個(gè)讀操作之后的所有作。4線程啟動(dòng)規(guī)這條規(guī)則是指線程A啟動(dòng)子線程B后,子線B能夠看到線程在啟動(dòng)子線程前操。
publicDemo{privatestaticintcount0;publicstaticvoidmain(String[]throwsInterruptedExceptionThread=Thread((){System.out.println(count);});count;t1.start();}}子線程t1能夠看見主線程對(duì)count變量的修改,所以在線程打出來的是12。也就是線程啟動(dòng)規(guī)則5線程結(jié)束規(guī)這條是關(guān)于線等待的。它是指主線A等待子線程B完(主線程通調(diào)用子線程的join()方法實(shí)現(xiàn)),當(dāng)線程B完成后(主線程中join()方法返回),主線能夠看到子線程的操。當(dāng)然所謂“看到”,指是對(duì)共享變量的操作。publicDemo{privatestaticintcount0;publicstaticvoidmain(String[]throwsInterruptedExceptionThread=Thread((){//count12;});t1.start();t1.join();//mian線程以到t1System.out.println(count);}}6中斷規(guī)則一個(gè)線程在另個(gè)線程上調(diào)用interrupt,Happens-Before被斷線程檢測(cè)到interrupt被調(diào)用。publicDemo{privatestaticintcount0;publicstaticvoidmain(String[]throwsInterruptedExceptionThread=Thread((){
//斷System.out.println(count);});t1.start();count;//errupt();}}mian線程中調(diào)用t1線的interrupt()方法mian對(duì)count的修改對(duì)t1線程是可見的。7終結(jié)器規(guī)則一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 耐高溫易加工聚酰亞胺項(xiàng)目建議書(立項(xiàng)報(bào)告)
- 中國純電動(dòng)客車行業(yè)市場(chǎng)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略規(guī)劃報(bào)告
- 2020-2025年中國融資租賃行業(yè)市場(chǎng)運(yùn)營現(xiàn)狀及行業(yè)發(fā)展趨勢(shì)報(bào)告
- 2024-2030年中國特種車改裝行業(yè)市場(chǎng)全景監(jiān)測(cè)及投資戰(zhàn)略咨詢報(bào)告
- 2025年度數(shù)據(jù)中心建筑工程承包勞務(wù)合同
- 2025年黑碳服裝襯項(xiàng)目投資可行性研究分析報(bào)告
- 走出教材學(xué)物理
- 2025年度文化旅游項(xiàng)目居間代理合同(年度版)
- 2025年礦機(jī)軸輥行業(yè)深度研究分析報(bào)告
- 2025年度數(shù)據(jù)中心建設(shè)合同范本
- 施工周報(bào)表(標(biāo)準(zhǔn)模版)
- 4.5MWp分布式光伏項(xiàng)目主要設(shè)備材料清單(建筑工程安裝工程)
- von frey絲K值表完整版
- 云南省普通初中學(xué)生成長記錄模板-好ok
- SB/T 10415-2007雞粉調(diào)味料
- 考古繪圖基礎(chǔ)
- GB/T 32574-2016抽水蓄能電站檢修導(dǎo)則
- 《社會(huì)主義市場(chǎng)經(jīng)濟(jì)理論(第三版)》第十三章社會(huì)主義市場(chǎng)經(jīng)濟(jì)標(biāo)準(zhǔn)論
- 變更索賠案例分析
- 過敏性休克的急救及處理流程教材課件(28張)
- 《花婆婆》兒童繪本故事
評(píng)論
0/150
提交評(píng)論