Java多執行緒之happen-before簡介
阿新 • • 發佈:2018-12-23
在JDK5 開始,Java使用新的JSR-133記憶體模型,該模型使用happens-before的概念來闡述操作之間的記憶體可見性。在JMM中,如果一個操作執行的結果需要對另一個操作可見,那麼這兩個操作之間必須要存在happens-before關係。這裡提到的兩個操作既可以是一個執行緒之內,也可以是在不同的執行緒之間。
與我們程式設計師密切相關的happens-before規則如下。
- 程式順序規則:一個執行緒中的每個操作,happens-before於該執行緒中的任意後續操作。
- 監視器鎖規則:對一個鎖的解鎖,happens-before於隨後對這個鎖的加鎖。
- volatile變數規則:對一個volatile域的寫,happens-bofore於任何後續對這個volatile域 的讀。
- 傳遞性:如果A happens-before B, B happens-bofore C ,那麼A happens-before C。
注意:兩個操作之間具有happen-before關係,並不意味著前一個操作必須在後一個操作之前執行!happens-before僅僅要求前一個操作(執行的結果)對後一個操作可見即可,且前一個操作按順序排在第二個操作之前。
happens-before 與 JVM的關係如圖所示:
如上圖所示,一個happens-before規則對應於一個或多個編譯器和處理器重排序規則。對於Java程式設計師來說,happens-before規則簡單易懂,它避免了Java程式設計師為了理解JMM提供了記憶體可見性保證而去學習複雜的重排序規則以及這些規則的具體實現方法。