通俗易懂講解happens-before原則


  在接下來的敘述里我首先會說明happens-before規則是干什么用的,然后用一個簡單的小程序說明happens-before規則

一、happens-before規則

我們編寫的程序都要經過優化后(編譯器和處理器會對我們的程序進行優化以提高運行效率)才會被運行,優化分為很多種,其中有一種優化叫做重排序,重排序需要遵守happens-before規則,不能說你想怎么排就怎么排,如果那樣豈不是亂了套。

happens-before部分規則如下:

1、程序順序規則:一個線程中的每個操作happens-before於該線程中的任意后續操作

2、監視器鎖(同步)規則:對於一個監視器的解鎖,happens-before於隨后對這個監視器的加鎖

注1:為什么是部分happens-before原則,因為這篇文章是讓你理解happens-before原則,我會盡量讓你專注在這件事情上不被其他的所影響

注2:程序順序規則中所說的每個操作happens-before於該線程中的任意后續操作並不是說前一個操作必須要在后一個操作之前執行,而是指前一個操作的執行結果必須對后一個操作可見,如果不滿足這個要求那就不允許這兩個操作進行重排序

二、例:下面的方法的功能是計算一個長方形面積

  1. public double rectangleArea(double length , double width){
  2. double leng;
  3. double wid;
  4. leng=length; //A
  5. wid=width; //B
  6. double area=leng*wid;//C
  7. return area;
  8. }



上面的操作在運行之前編譯器和處理器可能會進行優化

在程序中

A  happens-before  B

B  happens-before C

A  happens-before C //happens-before具有傳遞規則

根據happens-before規則我們來分析重排序后可能產生的結果

因為A  happens-before  B,所以A操作產生的結果leng一定要對B操作可見,但是現在B操作並沒有用到length,所以這兩個操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作進行了重排序,因為leng沒有被賦值,所以leng=0,area=0*wid也就是area=0;這個結果顯然是錯誤的,所以A操作是不能和C操作進行重排序的(這就是注2中說的前一個操作的執行結果必須對后羿操作可見,如果不滿足這個要求就不允許這兩個操作進行重排序)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM