您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中happens-befor的規(guī)則和用法”,在日常操作中,相信很多人在Java中happens-befor的規(guī)則和用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中happens-befor的規(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í)行結(jié)果必須對后一個操作可見,如果不滿足這個要求那就不允許這兩個操作進行重排序
二、例:下面的方法的功能是計算一個長方形面積
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ī)則我們來分析重排序后可能產(chǎn)生的結(jié)果
因為A happens-before B,所以A操作產(chǎn)生的結(jié)果leng一定要對B操作可見,但是現(xiàn)在B操作并沒有用到length,所以這兩個操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作進行了重排序,因為leng沒有被賦值,所以leng=0,area=0*wid也就是area=0;這個結(jié)果顯然是錯誤的,所以A操作是不能和C操作進行重排序的(這就是注2中說的前一個操作的執(zhí)行結(jié)果必須對后羿操作可見,如果不滿足這個要求就不允許這兩個操作進行重排序)
到此,關(guān)于“Java中happens-befor的規(guī)則和用法”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。