簡(jiǎn)單易懂講解happens-before原則
在接下來(lái)的敘述里我首先會(huì)說(shuō)明happens-before規(guī)則是干什么用的,然后用一個(gè)簡(jiǎn)單的小程序說(shuō)明happens-before規(guī)則
一、happens-before規(guī)則
我們編寫(xiě)的程序都要經(jīng)過(guò)優(yōu)化后(編譯器和處理器會(huì)對(duì)我們的程序進(jìn)行優(yōu)化以提高運(yùn)行效率)才會(huì)被運(yùn)行,優(yōu)化分為很多種,其中有一種優(yōu)化叫做重排序,重排序需要遵守happens-before規(guī)則,不能說(shuō)你想怎么排就怎么排,如果那樣豈不是亂了套。
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ì)盡量讓你專(zhuān)注在這件事情上不被其他的所影響
注2:程序順序規(guī)則中所說(shuō)的每個(gè)操作happens-before于該線程中的任意后續(xù)操作并不是說(shuō)前一個(gè)操作必須要在后一個(gè)操作之前執(zhí)行,而是指前一個(gè)操作的執(zhí)行結(jié)果必須對(duì)后一個(gè)操作可見(jiàn),如果不滿足這個(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ī)則我們來(lái)分析重排序后可能產(chǎn)生的結(jié)果
因?yàn)锳 happens-before B,所以A操作產(chǎn)生的結(jié)果leng一定要對(duì)B操作可見(jiàn),但是現(xiàn)在B操作并沒(méi)有用到length,所以這兩個(gè)操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作進(jìn)行了重排序,因?yàn)閘eng沒(méi)有被賦值,所以leng=0,area=0*wid也就是area=0;這個(gè)結(jié)果顯然是錯(cuò)誤的,所以A操作是不能和C操作進(jìn)行重排序的(這就是注2中說(shuō)的前一個(gè)操作的執(zhí)行結(jié)果必須對(duì)后羿操作可見(jiàn),如果不滿足這個(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語(yǔ)義
- 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)文章
Java利用File類(lèi)創(chuàng)建文件的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java中的File類(lèi)創(chuàng)建文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03Java 對(duì)稱(chēng)加密幾種算法分別實(shí)現(xiàn)
這篇文章主要介紹了Java 對(duì)稱(chēng)加密使用DES / 3DES / AES 這三種算法分別實(shí)現(xiàn)的相關(guān)資料,這里提供了實(shí)例代碼,需要的朋友可以參考下2017-01-01Springboot集成RabbitMQ報(bào)錯(cuò)及解決
這篇文章主要介紹了Springboot集成RabbitMQ報(bào)錯(cuò)及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Centos下SpringBoot項(xiàng)目啟動(dòng)與停止腳本的方法
這篇文章主要介紹了Centos下SpringBoot項(xiàng)目啟動(dòng)與停止腳本的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11關(guān)于MyBatis10種超好用的寫(xiě)法(收藏)
這篇文章主要介紹了關(guān)于MyBatis10種超好用的寫(xiě)法(收藏),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08MyBatis中的關(guān)聯(lián)關(guān)系配置與多表查詢(xún)的操作代碼
本文介紹了在MyBatis中配置和使用一對(duì)多和多對(duì)多關(guān)系的方法,通過(guò)合理的實(shí)體類(lèi)設(shè)計(jì)、Mapper接口和XML文件的配置,我們可以方便地進(jìn)行多表查詢(xún),并豐富了應(yīng)用程序的功能和靈活性,需要的朋友可以參考下2023-09-09