簡(jiǎn)單易懂講解happens-before原則
在接下來的敘述里我首先會(huì)說明happens-before規(guī)則是干什么用的,然后用一個(gè)簡(jiǎn)單的小程序說明happens-before規(guī)則
一、happens-before規(guī)則
我們編寫的程序都要經(jīng)過優(yōu)化后(編譯器和處理器會(huì)對(duì)我們的程序進(jìn)行優(yōu)化以提高運(yùn)行效率)才會(huì)被運(yùn)行,優(yōu)化分為很多種,其中有一種優(yōu)化叫做重排序,重排序需要遵守happens-before規(guī)則,不能說你想怎么排就怎么排,如果那樣豈不是亂了套。
happens-before部分規(guī)則如下:
1、程序順序規(guī)則:一個(gè)線程中的每個(gè)操作happens-before于該線程中的任意后續(xù)操作
2、監(jiān)視器鎖(同步)規(guī)則:對(duì)于一個(gè)監(jiān)視器的解鎖,happens-before于隨后對(duì)這個(gè)監(jiān)視器的加鎖
注1:為什么是部分happens-before原則,因?yàn)檫@篇文章是讓你理解happens-before原則,我會(huì)盡量讓你專注在這件事情上不被其他的所影響
注2:程序順序規(guī)則中所說的每個(gè)操作happens-before于該線程中的任意后續(xù)操作并不是說前一個(gè)操作必須要在后一個(gè)操作之前執(zhí)行,而是指前一個(gè)操作的執(zhí)行結(jié)果必須對(duì)后一個(gè)操作可見,如果不滿足這個(gè)要求那就不允許這兩個(gè)操作進(jìn)行重排序
二、例:下面的方法的功能是計(jì)算一個(gè)長(zhǎng)方形面積
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)行之前編譯器和處理器可能會(huì)進(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一定要對(duì)B操作可見,但是現(xiàn)在B操作并沒有用到length,所以這兩個(gè)操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作進(jìn)行了重排序,因?yàn)閘eng沒有被賦值,所以leng=0,area=0*wid也就是area=0;這個(gè)結(jié)果顯然是錯(cuò)誤的,所以A操作是不能和C操作進(jìn)行重排序的(這就是注2中說的前一個(gè)操作的執(zhí)行結(jié)果必須對(duì)后羿操作可見,如果不滿足這個(gè)要求就不允許這兩個(gè)操作進(jìn)行重排序)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java內(nèi)存模型(JMM)及happens-before原理
- Java內(nèi)存模型之happens-before概念詳解
- JAVA內(nèi)存模型和Happens-Before規(guī)則知識(shí)點(diǎn)講解
- 深入理解happens-before和as-if-serial語義
- volatile與happens-before的關(guān)系與內(nèi)存一致性錯(cuò)誤
- 深入淺出了解happens-before原則
- Java內(nèi)存之happens-before和重排序
- 淺談Java內(nèi)存模型之happens-before
- JMM核心概念之Happens-before原則
相關(guān)文章
簡(jiǎn)單學(xué)習(xí)Java抽象類要點(diǎn)及實(shí)例
這篇文章主要介紹了Java抽象類要點(diǎn)及實(shí)例,有需要的朋友可以參考一下2014-01-01
springboot中JSONObject遍歷并替換部分json值
這篇文章主要介紹了springboot中JSONObject遍歷并替換部分json值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
JAVA匿名內(nèi)部類(Anonymous Classes)的具體使用
本文主要介紹了JAVA匿名內(nèi)部類,匿名內(nèi)部類在我們JAVA程序員的日常工作中經(jīng)常要用到,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Java 中的HashMap詳解和使用示例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java 中的HashMap詳解和使用示例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-05-05
淺談java反射和自定義注解的綜合應(yīng)用實(shí)例
本篇文章主要介紹了java反射和自定義注解的綜合應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
實(shí)例講解Java并發(fā)編程之ThreadLocal類
這篇文章主要介紹了實(shí)例講解Java并發(fā)編程之ThreadLocal類,本文給出了模擬ThreadLocal、實(shí)用ThreadLocal等代碼實(shí)例,需要的朋友可以參考下2015-04-04
Java 線程對(duì)比(Thread,Runnable,Callable)實(shí)例詳解
這篇文章主要介紹了Java 線程(Thread,Runnable,Callable)實(shí)例詳解的相關(guān)資料,這里對(duì)java 線程的三種方法進(jìn)行了對(duì)比,需要的朋友可以參考下2016-12-12

