歡迎光臨
每天分享高質量文章

【死磕Java併發】—–Java記憶體模型之總結

經過四篇部落格闡述,我相信各位對Java記憶體模型有了最基本認識了,下麵LZ就做一個比較簡單的總結。

總結

JMM規定了執行緒的工作記憶體和主記憶體的互動關係,以及執行緒之間的可見性和程式的執行順序。一方面,要為程式員提供足夠強的記憶體可見性保證;另一方面,對編譯器和處理器的限制要盡可能地放鬆。JMM對程式員遮蔽了CPU以及OS記憶體的使用問題,能夠使程式在不同的CPU和OS記憶體上都能夠達到預期的效果。

Java採用記憶體共享的樣式來實現執行緒之間的通訊。編譯器和處理器可以對程式進行重排序最佳化處理,但是需要遵守一些規則,不能隨意重排序。

原子性:一個操作或者多個操作要麼全部執行要麼全部不執行;

可見性:當多個執行緒同時訪問一個共享變數時,如果其中某個執行緒更改了該共享變數,其他執行緒應該可以立刻看到這個改變;

有序性:程式的執行要按照程式碼的先後順序執行;

在併發程式設計樣式中,勢必會遇到上面三個概念,JMM對原子性並沒有提供確切的解決方案,但是JMM解決了可見性和有序性,至於原子性則需要透過鎖或者Synchronized來解決了。

如果一個操作A的操作結果需要對操作B可見,那麼我們就認為操作A和操作B之間存在happens-before關係,即A happens-before B。

happens-before原則是JMM中非常重要的一個原則,它是判斷資料是否存在競爭、執行緒是否安全的主要依據,依靠這個原則,我們可以解決在併發環境下兩個操作之間是否存在衝突的所有問題。JMM規定,兩個操作存在happens-before關係並不一定要A操作先於B操作執行,只要A操作的結果對B操作可見即可。

在程式執行過程中,為了執行的效率,編譯器和處理器是可以對程式進行一定的重排序,但是他們必須要滿足兩個條件:1 執行的結果保持不變,2 存在資料依賴的不能重排序。重排序是引起多執行緒不安全的一個重要因素。

同時順序一致性是一個比較理想化的參考模型,它為我們提供了強大而又有力的記憶體可見性保證,他主要有兩個特徵:1 一個執行緒中的所有操作必須按照程式的順序來執行;2 所有執行緒都只能看到一個單一的操作執行順序,在順序一致性模型中,每個操作都必須原則執行且立刻對所有執行緒可見。

博文串列

  1. 死磕Java併發】—–Java記憶體模型之happens-before

  2. 【死磕Java併發】—–Java記憶體模型之重排序

  3. 死磕Java併發】—–Java記憶體模型之分析volatile

  4. 【死磕Java併發】—–Java記憶體模型之從JMM角度分析DCL

Java記憶體模型推薦資料

  1. 程曉明:深入Java記憶體模型

  2. 周志明:深入理解Java虛擬機器-第五部分 高效併發

  3. Java 併發程式設計:volatile的使用及其原理

  4. Java併發程式設計:volatile關鍵字解析

  5. 聊聊高併發(三十三)Java記憶體模型那些事(一)從一致性(Consistency)的角度理解Java記憶體模型

  6. 聊聊高併發(三十四)Java記憶體模型那些事(二)理解CPU高速快取的工作原理

  7. 聊聊高併發(三十五)Java記憶體模型那些事(三)理解記憶體屏障

  8. 聊聊高併發(三十六)Java記憶體模型那些事(四)理解Happens-before規則

  9. happens-before俗解

贊(0)

分享創造快樂