1. 程式人生 > >Java多執行緒系列-happens-before規則和as-if-serial語義

Java多執行緒系列-happens-before規則和as-if-serial語義

JSR-133使用happens-before的概念來闡述操作之間的記憶體可見性。在JMM中,如果一個操作執行的結果需要對另一個操作可見,

那麼這2個操作之間必須要存在happens-before關係。這裡提到的2個操作既可以是一個執行緒之內,也可以是不同執行緒之間。

與程式設計師密切相關的happens-before規則如下:
1、程式順序規則:一個執行緒中的每個操作,happens-before於執行緒中的任意後續操作。
2、監視器鎖規則:一個鎖的解鎖,happens-before於隨後對這個鎖的加鎖。
3、volatile變數規則:對一個volatile域的寫,happens-before於任意後續對這個volatile域的讀。

4、傳遞性:如果A happens-before B,且Bhappens-before C,那麼Ahappens-before C。


需要注意的是:
    兩個操作之間具有happens-before關係,並不意味著前一個操作必須要在後一個操作之前執行!
happens-before僅僅要求前一個操作(執行的結果)對後一個操作可見,且前一個操作按順序排在第
二個操作之前。


    一個happens-before規則對應一個或多個編譯器和處理器重排序規則。對於Java程式設計師來說,
happens-before規則簡單易懂,它避免Java程式設計師為了理解JMM提供的記憶體可見性保證而去

學習複雜的重排序以及這些規則的具體實現方法。

as-if-serial語義

as-if-serial語義的意思是:不管怎麼重排序(編譯器和處理器為了提高並行度),(單執行緒)程式的執行結果不會改變。

編譯器、runtime和處理器都必須遵守as-if-serial語義。

為了遵守as-if-serial語義,編譯器和處理器不會對存在資料依賴關係的操作做重排序,因為這種重排序會改變執行結果。

但是,如果操作之間不存在資料依賴關係,這些操作就可能被編譯器和處理器重排序。