簡單易懂講解happens-before原則
在接下來的敘述里我首先會說明happens-before規(guī)則是干什么用的,然后用一個(gè)簡單的小程序說明happens-before規(guī)則
一、happens-before規(guī)則
我們編寫的程序都要經(jīng)過優(yōu)化后(編譯器和處理器會對我們的程序進(jìn)行優(yōu)化以提高運(yùn)行效率)才會被運(yùn)行,優(yōu)化分為很多種,其中有一種優(yōu)化叫做重排序,重排序需要遵守happens-before規(guī)則,不能說你想怎么排就怎么排,如果那樣豈不是亂了套。
happens-before部分規(guī)則如下:
1、程序順序規(guī)則:一個(gè)線程中的每個(gè)操作happens-before于該線程中的任意后續(xù)操作
2、監(jiān)視器鎖(同步)規(guī)則:對于一個(gè)監(jiān)視器的解鎖,happens-before于隨后對這個(gè)監(jiān)視器的加鎖
注1:為什么是部分happens-before原則,因?yàn)檫@篇文章是讓你理解happens-before原則,我會盡量讓你專注在這件事情上不被其他的所影響
注2:程序順序規(guī)則中所說的每個(gè)操作happens-before于該線程中的任意后續(xù)操作并不是說前一個(gè)操作必須要在后一個(gè)操作之前執(zhí)行,而是指前一個(gè)操作的執(zhí)行結(jié)果必須對后一個(gè)操作可見,如果不滿足這個(gè)要求那就不允許這兩個(gè)操作進(jìn)行重排序
二、例:下面的方法的功能是計(jì)算一個(gè)長方形面積
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ùn)行之前編譯器和處理器可能會進(jìn)行優(yōu)化
在程序中
A happens-before B
B happens-before C
A happens-before C //happens-before具有傳遞規(guī)則
根據(jù)happens-before規(guī)則我們來分析重排序后可能產(chǎn)生的結(jié)果
因?yàn)锳 happens-before B,所以A操作產(chǎn)生的結(jié)果leng一定要對B操作可見,但是現(xiàn)在B操作并沒有用到length,所以這兩個(gè)操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作進(jìn)行了重排序,因?yàn)閘eng沒有被賦值,所以leng=0,area=0*wid也就是area=0;這個(gè)結(jié)果顯然是錯誤的,所以A操作是不能和C操作進(jìn)行重排序的(這就是注2中說的前一個(gè)操作的執(zhí)行結(jié)果必須對后羿操作可見,如果不滿足這個(gè)要求就不允許這兩個(gè)操作進(jìn)行重排序)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot集成RabbitMQ報(bào)錯及解決
這篇文章主要介紹了Springboot集成RabbitMQ報(bào)錯及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Centos下SpringBoot項(xiàng)目啟動與停止腳本的方法
這篇文章主要介紹了Centos下SpringBoot項(xiàng)目啟動與停止腳本的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
MyBatis中的關(guān)聯(lián)關(guān)系配置與多表查詢的操作代碼
本文介紹了在MyBatis中配置和使用一對多和多對多關(guān)系的方法,通過合理的實(shí)體類設(shè)計(jì)、Mapper接口和XML文件的配置,我們可以方便地進(jìn)行多表查詢,并豐富了應(yīng)用程序的功能和靈活性,需要的朋友可以參考下2023-09-09

