日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Java內(nèi)存模型Memory Model

 昵稱63557093 2020-03-10

  Java內(nèi)存模型,Java Memory Model,我個人更喜歡“Java存儲模型”的譯法。

  介紹

  如前所述,JVM被設計成一臺抽象的虛擬計算機,JVM的并發(fā)問題及解決方案與物理計算機中的并發(fā)問題有很多相似之處。

  由于現(xiàn)代計算機的內(nèi)存與CPU在運算速度上的巨大差別,通常會加入一層更接近CPU讀寫速度的高速緩存(Cache),將運算使用到的數(shù)據(jù)復制到Cache中,讓運算能加速進行,運算結(jié)束后再從Cache同步回內(nèi)存之中。這個設計解決了速度的矛盾,也帶來了一個新的問題:緩存一致性。在多CPU系統(tǒng)中,每個CPU都有自己的Cache,它們共享同一主內(nèi)存,當多個CPU的運算任務涉及同一塊內(nèi)存區(qū)域時,就可能導致各自的Cache數(shù)據(jù)不一致。對此又設計了“緩存一致性協(xié)議”,如MESI,要求各個CPU在讀寫Cache時,都遵循這些協(xié)議進行操作,以解決緩存數(shù)據(jù)不一致的問題?!皟?nèi)存模型”(Memory Model),就是在特定的協(xié)議下,對特定的高速緩存讀寫訪問過程進行抽象。不同架構(gòu)的物理機器擁有不一樣的內(nèi)存模式,而Java虛擬機也有自己的內(nèi)存模型,其基礎原理是共通的。

  此外,為了充分利用CPU的運算單元,可能會對輸入代碼進行亂序執(zhí)行優(yōu)化,只保證執(zhí)行結(jié)果的一致性,但不保證各語句的計算順序與輸入代碼一致。Java虛擬機的即時編譯器也有類似的指令重排序優(yōu)化。

  Java語言規(guī)范中試圖定義一種Java內(nèi)存模型,以實現(xiàn)Java程序在各種平臺上能達到一致的內(nèi)存訪問效果,為多線程的同步和避免數(shù)據(jù)爭用提供一套有效平衡高吞吐與一致性的保障機制。

  什么是Java內(nèi)存模型

  一個內(nèi)存模型描述的是,給定程序的某個特定的執(zhí)行軌跡(trace)是否是該程序的一個合法執(zhí)行。Java內(nèi)存模型檢查執(zhí)行軌跡中的每次讀操作,以及根據(jù)特定規(guī)則,校驗該讀操作觀察到的寫是否合法。內(nèi)存模型描述了一個程序的可預期行為,具體實現(xiàn)時擁有充分的自由度去生成需要的代碼,只要其最終執(zhí)行結(jié)果可經(jīng)由內(nèi)存模型進行推測。

  通俗地講,Java內(nèi)存模型(JMM)定義了一系列規(guī)則,以確保某一線程的寫操作能正確呈現(xiàn)給其他線程。JMM并沒有描述多線程該如何執(zhí)行,而是描述多線程允許的行為。

  JMM規(guī)定了所有的共享變量都存儲在JVM的主內(nèi)存中。每條線程有自己的工作內(nèi)存,用于保存該線程用到的變量的主內(nèi)存副本拷貝(具體實現(xiàn)通常不會拷貝整個對象),線程對變量的操作全部在工作內(nèi)存中進行,不能直接讀寫主內(nèi)存中的變量。不同的線程間也無法直接訪問對方的工作內(nèi)存,線程間變量值的傳遞需要通過主內(nèi)存來完成。

  關于主內(nèi)存和工作內(nèi)存之間的具體交互協(xié)議,即一個變量如何從主內(nèi)存拷貝到工作內(nèi)存、如何從工作內(nèi)存同步回主內(nèi)存之類的實現(xiàn)細節(jié),JMM定義了8種操作(lock,unlock,read,load,use,assign,store,write),虛擬機實現(xiàn)時必須保證以上每一種操作都是原子的、不可再分的。

  共享變量/堆內(nèi)存:能夠在線程間共享的內(nèi)存稱作“共享內(nèi)存或堆內(nèi)存”。所有的實例域、靜態(tài)域以及數(shù)組元素都存儲在堆內(nèi)存中。方法中的局部變量永遠不會被線程間共享,也不會受內(nèi)存模型影響。我們也無需關心線程內(nèi)動作,每個單線程都應遵守正確的線程內(nèi)語義。

  線程間的動作:線程間的動作是由某一線程執(zhí)行,能被另一線程探測或直接影響的動作。包括:

  共享變量的讀/寫

  同步動作 (synchronization action)

  lock/unlock某個monitor;

  讀寫某個volatile變量

  啟動一個線程

  與外部交互的動作

  導致某個線程進入無限循環(huán)的動作(thread devergence action)

  延伸閱讀

  本文參考了《深入理解Java虛擬機》、《JSR-133-Memory Model》,有充裕時間的同學可以去完整過一遍,但原文有較多艱澀難懂之處。這里做了較大的裁剪,隱藏更深一層的信息,以求對Java內(nèi)存模型能有一個快速又不過于淺顯的了解。更多的概念和規(guī)則:

  緩存一致性,Cache Coherence,MESI協(xié)議

  Instruction Reorder,指令重排序

  Happens-Before 關系規(guī)則

  As-If-Serial ,線程內(nèi)串行的語義

  Memory Barrier,內(nèi)存屏障

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多