happens-before 理解

從JDK 5 開始,JMM就使用happens-before的概念來闡述多線程之間的內存可見性。在JMM中,若是一個操做執行的結果須要對另外一個操做可見,java

那麼這2個操做之間必需要存在happens-before關係。這裏提到的2個操做既能夠是一個線程以內,也能夠是不一樣線程之間。程序員

與程序員密切相關的happens-before規則以下:
一、程序順序規則:一個線程中的每一個操做,happens-before於線程中的任意後續操做。
二、監視器鎖規則:一個鎖的解鎖,happens-before於隨後對這個鎖的加鎖。
三、volatile變量規則:對一個volatile域的寫,happens-before於任意後續對這個volatile域的讀。
四、傳遞性:若是A happens-before B,且Bhappens-before C,那麼Ahappens-before C。

 

 

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


    一個happens-before規則對應一個或多個編譯器和處理器重排序規則。對於Java程序員來講,
happens-before規則簡單易懂,它避免Java程序員爲了理解JMM提供的內存可見性保證而去
學習複雜的重排序以及這些規則的具體實現方法。
相關文章
相關標籤/搜索