簡單易懂講解happens-before原則
在接下來的敘述里我首先會說明happens-before規(guī)則是干什么用的,然后用一個簡單的小程序說明happens-before規(guī)則
一、happens-before規(guī)則
我們編寫的程序都要經(jīng)過優(yōu)化后(編譯器和處理器會對我們的程序進行優(yōu)化以提高運行效率)才會被運行,優(yōu)化分為很多種,其中有一種優(yōu)化叫做重排序,重排序需要遵守happens-before規(guī)則,不能說你想怎么排就怎么排,如果那樣豈不是亂了套。
happens-before部分規(guī)則如下:
1、程序順序規(guī)則:一個線程中的每個操作happens-before于該線程中的任意后續(xù)操作
2、監(jiān)視器鎖(同步)規(guī)則:對于一個監(jiān)視器的解鎖,happens-before于隨后對這個監(jiān)視器的加鎖
注1:為什么是部分happens-before原則,因為這篇文章是讓你理解happens-before原則,我會盡量讓你專注在這件事情上不被其他的所影響
注2:程序順序規(guī)則中所說的每個操作happens-before于該線程中的任意后續(xù)操作并不是說前一個操作必須要在后一個操作之前執(zhí)行,而是指前一個操作的執(zhí)行結果必須對后一個操作可見,如果不滿足這個要求那就不允許這兩個操作進行重排序
二、例:下面的方法的功能是計算一個長方形面積
public double rectangleArea(double length , double width){ double leng; double wid; leng=length;//A wid=width;//B double area=leng*wid;//C return area; }
上面的操作在運行之前編譯器和處理器可能會進行優(yōu)化
在程序中
A happens-before B
B happens-before C
A happens-before C //happens-before具有傳遞規(guī)則
根據(jù)happens-before規(guī)則我們來分析重排序后可能產生的結果
因為A happens-before B,所以A操作產生的結果leng一定要對B操作可見,但是現(xiàn)在B操作并沒有用到length,所以這兩個操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作進行了重排序,因為leng沒有被賦值,所以leng=0,area=0*wid也就是area=0;這個結果顯然是錯誤的,所以A操作是不能和C操作進行重排序的(這就是注2中說的前一個操作的執(zhí)行結果必須對后羿操作可見,如果不滿足這個要求就不允許這兩個操作進行重排序)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
MyBatis中的關聯(lián)關系配置與多表查詢的操作代碼
本文介紹了在MyBatis中配置和使用一對多和多對多關系的方法,通過合理的實體類設計、Mapper接口和XML文件的配置,我們可以方便地進行多表查詢,并豐富了應用程序的功能和靈活性,需要的朋友可以參考下2023-09-09