【並發編程】JMM:java記憶體模型抽象

來源:互聯網
上載者:User

標籤:jmm   java並發編程   java記憶體模型   記憶體可見度   

本文試圖向大家解釋清楚JMM及其抽象模型,但不僅僅是一個介紹,更希望能講清楚JMM記憶體模型抽象的原因。

一、JMM的概念;

二、JMM的抽象將記憶體記憶體模型分成線程私人的本地記憶體和所有線程共用的主存;

三、JMM抽象模型造成了並發編程中共用變數的記憶體可見度問題,為什麼會造成?選擇這樣的抽象模型有什麼好處?有什麼樣的方法來處理這個問題?


一、JMM

    JMM直譯過來就是java記憶體模型(java memory model),他的更深層次的描述,“JMM是一個語言級的記憶體模型,通過屏蔽各個系統平台的差異,對程式猿提供一個各個系統平台一致的記憶體模型,他描繪了共用變數在記憶體中存取抽象過程規定了一個線程操作共用變數的結果何時對其他線程可見。”


二、JMM抽象

    java的並行存取模型是基於記憶體共用的,通過共用記憶體之間的公用狀態來進行線程通訊,這種共用實際上就是共用變數的讀寫操作

    除了上述java的並行存取模型,還有兩條線索引出java記憶體模型的抽象。第一條,“速度線索”,按照速度從快到慢,“CPU> 寄存器> 快取> 記憶體> 磁碟緩衝> 磁碟”,快取是為了緩解寄存器和記憶體之間的速度差異,同樣的磁碟緩衝緩解了記憶體和磁碟之間的速度差異;第二條,“匯流排事務線索”,在多CPU的系統中,無論何時,都只有一個CPU能操作記憶體,這一系列CPU和記憶體之間的競爭和通訊通過匯流排事務(包含讀寫事物)來描述,如。


    基於以上兩條線索(細節在下一節描述),java記憶體模型的抽象可以這樣來描述,“每個啟動並執行線程都有一個私人的本地記憶體,所有線程共用主存,所有線程對共用變數的讀操作都首先從本地記憶體擷取,如果沒有則從主存擷取;所有線程的寫操作都首先寫到本地記憶體,在恰當的時機寫回主存”。JMM的抽象模型看起來如所述。


    以上內容通過“基於記憶體並行存取模型、速度線索和匯流排事務線索”引出JMM的抽象模型。還有一些沒有講清楚的地方,下面需要更詳細的解釋。


三、更多細節

    為什麼JMM的抽象結果要劃分成線程私人的本地記憶體和所有線程共用的主存

1. 系統模型和JMM的對應

    在談論更多細節之前,先強行把速度線索中描繪的硬體和JMM抽象模型對應,實際上JMM的抽象也基於此,要結合電腦群組成原理來理解這部分內容。


2. 本地記憶體引發的並發問題

    首先明確的前提是java的並行存取模型是基於記憶體讀寫共用變數來進行通訊的,線程之間要進行通訊,只有通過讀寫主存,也就是JMM通過控制每個線程的本地記憶體與主存之間的互動,來向程式猿提供記憶體可見度保證。基於這樣的描述,其實JMM是可以跳開本地記憶體的,直接操作主存進行線程通訊會更簡單更可靠。引入本地記憶體還會導致一些不好的結果,如所述,A/B兩個線程並行操作一個擁有共用變數(實際上就是對外可以訪問的執行個體變數)的對象,該對象初始化完成的時候a、b變數都進行了預設初始化,即a=b=0,存在堆記憶體中(主存),操作開始之前,AB兩個線程都會獲得ab變數的副本存在於本地記憶體當中,當執行到a=1的時候,將1賦值給本地記憶體中的a,注意是本地記憶體,而不是主存中的a,同樣的b=2,也只是將2賦值給B線程中的b變數而並沒有寫到主存,此時對於xy的賦值操作,都會從主存中擷取,從而出現一個可能的執行結果,a=1,b=2,x=0,y=0。



    然而直接操作主存,就不會出現這樣的結果,因為任意時刻都只會有一顆CPU獲得匯流排事務,也就意味著任意時刻,都只有一個線程可以操作共用變數,但是基於此模型的代碼執行速度誰能忍受?為了表明這一原因,“速度線索”中快取緩解記憶體和寄存器之間的速度不匹配問題,“緩解”的過程是將重新整理到主存的內容儲存到快取中,積累到一定量再一次性刷到記憶體(此時其他線程才可見),這樣的好處可以通過java傳統IO流中緩衝流提高速度的原理想象得到,正如“匯流排事務線索”中描述那樣,集中刷主存,減少了匯流排事務競爭的次數和匯流排佔用,從而獲得更高的效能。

3. 解決問題

    如何解決?這正是多線程中同步的意義。同步做了那些事情?同步保證了原子性、互斥性、記憶體可見度和順序系(禁止重排序)。同步的內容談起來也有很多內容,不只是一個簡簡單單的使用synchronized或Lock,而更多的是希望能講明白synchronized和lock表達的記憶體語義,這一部分會抽時間單獨來寫。


四、補充

    本文只涉及java並發編程最開始的一些淺顯內容,其他更多的內容並未涉及,後續會抽時間逐步完善。


附註:

    本文如有錯漏,煩請不吝指正,謝謝!

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

【並發編程】JMM:java記憶體模型抽象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.