操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    JMM(Java Model)即Java內存模型,更多體現為一種規范和規則。該規范定義了一個線程對共享變量的寫入時,如何確保對另一個線程是可見的。

    JMM雖然并不像JVM內存結構一樣是真實存在的運行實體,但其具備以下價值:

    Java內存模型中的兩個概念主內存:主要存儲的是Java實例對象,所有線程創建的實例對象都存放在主內存中,不管該實例對象是成員變量還是方法中的局部變量。當然也包括了共享的類信息、常量、靜態變量。由于是共享數據區域,多條線程對同一個變量進行訪問可能會發生線程安全問題。工作內存:主要存儲當前方法的所有本地變量信息(工作內存中存儲著主內存的變量副本),每個線程只能訪問自己的工作內存,即線程中的本地變量對其他線程是不可見的,就算是兩個線程執行同一段代碼,它們也會各自在自己的工作內存中創建屬于當前線程的本地變量,包括字節碼行號指示器、相關方法信息。由于工作內存是每個線程的私有數據,線程間無法相互訪問工作內存,因此存儲在工作內存的數據不存在線程安全問題。

    Java內存模型規定所有變量存儲在主內存中;每個線程都有自己的工作內存,且對變量的操作都是在工作內存中進行;不同線程間無法直接訪問彼此工作內存中的變量,想要訪問只能通過主內存來傳遞。

    JMM將所有的變量都存放在公共主內存中,當線程使用變量時,會把公共主內存里的變量復制到自己的私有工作內存中,線程對變量的讀寫操作,實際操作的是自己工作內存中的變量副本。因此JMM模型也需要解決代碼重排序和緩存可見性問題。如何解決呢,JMM提供的方案包括、、final等等。JMM定義了一些內存操作的抽象指令集,然后將這些抽象指令包含到、等關鍵字的語義中,并要求JVM在實現這些關鍵字時必須具備其包含的JMM抽象指令的能力。

    JMM與JVM運行時內存的關系

    JMM是屬于語言級別的內存模型,它確保了在不同的編譯器和不同的處理平臺上,為Java程序員提供一致的內存可見性保證和指令并發執行的有序性。JMM屬于概念和規范維度的模型,是一個參考性質的模型,定義了一個指令集、一個虛擬計算架構、一個執行模型。具體的JVM需要遵循JMM的定義進行實現,它能夠運行根據JMM模型指令集編寫的代碼,就像真機可以運行機器代碼一樣。

    JVM是Java虛擬機,雖然也是一個概念和規范維度的模型,但通常將JVM理解為實體的、實現維度的虛擬機,一把指 VM。JVM在執行Java程序時,會把所管理的內存劃分為若干個不同的數據區域,每個區域用途不同,有些區域隨著虛擬機進程的啟動而存在,有些區域依賴用戶線程的啟動和結束而建立和銷毀。《Java虛擬機規范(Java SE 8)》中描述的JVM運行時內存區域結構如圖:

    c語言申請動態內存問題_c語言申請動態內存失敗_c語言該內存不能為written

    JMM與硬件內存架構的關系

    多線程的執行最終都會映射到硬件處理器上執行,但是JMM與硬件內存架構并不完全一致。對于硬件來說,只有寄存器、高速緩存、主存的概念,并沒有工作內存(線程私有數據區)和主內存(堆內存)之分,也就是說JMM對內存的劃分對硬件內存沒有任何影響,因為JMM只是一種抽象的概念,是一組規則,并不實際存在。無論是JMM工作內存還是主內存的數據,對于計算機硬件來說都會存儲在計算機主存中,也可能存儲到CPU高速緩存、或者寄存器中。總體來說,JMM和計算機硬件內存架構是一個相互交叉的關系,是一種抽象概念的劃分與真實物理硬件的交叉。

    Java內存模型的8個操作

    JMM定義了一套自己的主內存與工作內存之間的交互協議,即一個變量如何從主內存拷貝到工作內存,又是如何從工作內存寫入主內存。該協議有8中操作,要求JVM在實現時必須保證其中每一個操作都是原子的。這8種操作是:

    簡單來說,把一個變量從主內存拷貝到工作內存,就要按順序執行Read和Load操作;線程通過Use和操作對變量進行計算處理;如果要把變量從工作內存同步會主內存,就要按順序執行Store和Write操作。

    注意:JMM要求Read和Load、Store和Write不能單獨出現,其必須按順序執行,但不要求是連續執行,即在Read和Load之間、Store和Write之間可以插入其他指令。

    以上JMM的8個操作規范定義相當嚴謹,也極為繁瑣,JVM實現起來也非常復雜。Java設計團隊在新的JMM版本中不斷地對這些操作進行簡化,如將8個操作簡化為Read、Write、Lock、四個操作。雖然進行了簡化,但是JMM的基礎設計并未改變。

    c語言申請動態內存問題_c語言該內存不能為written_c語言申請動態內存失敗

    Java內存模型的內存屏障

    JMM提供了自己的內存屏障指令,要求JVM編譯器實現這些指令,禁止特定類型的編譯器和處理器重排序,從而解決了順序一致性問題。

    JMM定義了不對應任何處理器的JMM邏輯層內存屏障,來屏蔽底層CPU硬件平臺的差異。主要有Load和Store兩類:

    在實際使用中,對Load 和Store 兩類屏障進行組合,組合成四個屏障,用于禁止特定類型的處理器重排序:

    Load1;LoadLoad;Load2
    該示例的含義為:
    在Load2要讀取的數據被訪問前,使用LoadLoad屏障保證Load1要讀取的數據被讀取完畢。
    該指令會讓【編譯器】和【處理器】禁止對其前后的指令進行重排序;
    

    c語言申請動態內存失敗_c語言該內存不能為written_c語言申請動態內存問題

    該指令會讓高速緩存中的數據失效,重新從主內存加載數據

    Store1;StoreStore;Store2;
    該示例的含義為:
    在Store2及后續寫入操作執行前,使用StoreStore屏障保證Store1的寫入結果對其他處理器可見。
    該指令會讓【編譯器】和【處理器】禁止對其前后的指令進行重排序;
    該指令會讓高速緩存從的最新數據寫回到主內存;

    Load1;LoadStore;Store2;
    該示例的含義為:
    

    c語言申請動態內存失敗_c語言申請動態內存問題_c語言該內存不能為written

    在Store2及后續寫入操作執行前,使用LoadStore屏障保證Load1要讀取的數據被讀取完畢。 該指令會讓【編譯器】和【處理器】禁止對其前后的指令進行重排序; 該指令會讓高速緩存中的數據失效,重新從主內存加載數據;

    Store1;StoreLoad;Load2
    該示例的含義為:
    在Load2及后續所有讀取操作執行前,使用StoreLoad屏障保證Store1的寫入結果對所有處理器可見。
    該指令會讓【編譯器】和【處理器】禁止對其前后的指令進行重排序;
    

    c語言該內存不能為written_c語言申請動態內存失敗_c語言申請動態內存問題

    該指令會讓高速緩沖中Store1指令結果【寫回主內存】; 該指令會讓高速緩存中Load2執行重新從主內存加載數據

    JMM中的四個內存屏障的性能開銷是不一樣的。

    、兩個屏障的性能最高。因為在這兩個屏障的上下文中,高速緩存和主內存只需要一種類型的交互即可完成,JMM只需保證同類型交互的先后順序即可,緩存數據一致性的維護工作量相對較小;的性能相對較低。此屏障要求數據加載執行在前,數據寫入執行在后,只要求了被加載數據的可見性,沒有要求后面寫入數據的可見性,所以,該屏障沒有緩存數據一致性的維護工作量。另外,該屏障限制了Store不能重排到Load之前。

    的性能最低,原因是:需要維護緩存數據一致性。

    對應到物理硬件平臺上,JMM的屏障,最終會編譯成硬件層面的全屏障(Full )。而全屏障不僅僅要讓寄存器、高速緩存中的最新數據寫回到主內存,還要讓高速緩存中的數據失效,重新從主內存加載數據c語言申請動態內存失敗,另外,還全方位的禁止了對屏障指令前后的Store/Load指令進行重排序。所以屏障的性能最低、開銷最大。

    Java內存模型中的-規則

    JMM定義了一套自己的規則:-(先行發生)規則,且確保兩個Java語句之間必須存在-關系。JMM盡量確保這兩個語句之間的內存可見性和指令有序性。

    -規則主要包括一下幾個方面:

    程序順序執行規則(As-If-規則):在同一個線程里面,有依賴關系的操作按照先后順序,前一個操作必須先行于(-)后一個操作;換句話說,單線程中的代碼順序不管如何重排,結果都不變;變量規則:對修飾變量的寫操作,必須先行于(-)對變量的讀操作。傳遞性規則:如果A操作先行于B操作,而B操作先行于C操作,那么A操作先行于(-)C操作。監視鎖規則:對于一個監視鎖的解鎖操作,先行于(-)后續對這個監視鎖的加鎖操作。start規則:如果線程A執行B.start()啟動線程B,那么線程A的B.start()操作先行于(-)線程B中的任何操作。join規則:如果線程A執行了B.join()操作并成功返回c語言申請動態內存失敗,那么線程B中的任何操作先行于(-)線程A所執行的B.join()操作。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有