国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java內(nèi)存模型之happens-before概念詳解

瀏覽:71日期:2022-08-10 17:11:15
簡(jiǎn)介

happens-before是JMM的核心概念。理解happens-before是了解JMM的關(guān)鍵。

1、設(shè)計(jì)意圖

JMM的設(shè)計(jì)需要考慮兩個(gè)方面,分別是程序員角度和編譯器、處理器角度:

程序員角度,希望內(nèi)存模型易于理解、易于編程。希望是一個(gè)強(qiáng)內(nèi)存模型。 編譯器和處理器角度,希望減少對(duì)它們的束縛,以至于編譯器和處理器可以做更多的性能優(yōu)化。希望是一個(gè)弱內(nèi)存模型。

​因此JSR-133專家組設(shè)計(jì)JMM的核心目標(biāo)就兩個(gè):

為程序員提供足夠強(qiáng)的內(nèi)存模型對(duì)編譯器和處理器的限制盡可能少

​下面通過(guò)一段代碼來(lái)看JSR-133如何實(shí)現(xiàn)這兩個(gè)目標(biāo):

double pi = 3.14;//Adouble r = 1.0;//Bdouble area = pi * r * r //C

上述代碼存在如下happens-before關(guān)系:

A happens-before B B happens-before C A happens-before C

這3個(gè)happens-before關(guān)系中,第二個(gè)和第三個(gè)是必須的,而第一個(gè)是非必須的(A、B操作之間重排序,程序執(zhí)行結(jié)果不會(huì)發(fā)生改變)。JMM把happens-before要求禁止的重排序分為下面的兩類:

會(huì)改變程序執(zhí)行結(jié)果的重排序 不會(huì)改變程序執(zhí)行結(jié)果的重排序

JMM對(duì)這兩種不同性質(zhì)的重排序,采取了不同的策略:

對(duì)于會(huì)改變程序執(zhí)行結(jié)果的重排序,JMM要求編譯器和處理器必須禁止 對(duì)于不會(huì)改變程序執(zhí)行結(jié)果的重排序,JMM不做要求(JMM運(yùn)行)

JMM設(shè)計(jì)示意圖:

Java內(nèi)存模型之happens-before概念詳解

JMM設(shè)計(jì)示意圖

總結(jié):

JMM給程序員提供的happens-before規(guī)則能滿足程序員的需求。簡(jiǎn)單易懂,具有足夠強(qiáng)的內(nèi)存可見性保證。 JMM對(duì)編譯器和處理器的束縛盡可能少。遵循的原則是:不改變程序的執(zhí)行結(jié)果(正確同步或單線程執(zhí)行),編譯器和處理器可以任意優(yōu)化。 2、happens-before的定義

起源:happens-before規(guī)則來(lái)源于Leslie Lamport《Time, Clocks and the Ordering of Events in a Distributed System》。該論文中使用happens-before來(lái)定義分布式系統(tǒng)中事件之間的偏序關(guān)系(partial ordering),該文中給出了一個(gè)分布式算法,能用來(lái)將偏序關(guān)系擴(kuò)展為某種全序關(guān)系。

Java中的應(yīng)用:JSR-133使用happens-before來(lái)指定兩個(gè)操作之間的執(zhí)行順序。JMM可以通過(guò)happens-before關(guān)系向程序員提供跨線程的內(nèi)存可見性保證。

《JSR-133:Java Memory Model and Thread Specification》對(duì)happens-before關(guān)系的定義如下:

如果操作A happens-before 操作B,那么A操作的執(zhí)行結(jié)果將會(huì)對(duì)操作B可見,且操作A的執(zhí)行順序排在操作B之前——JMM對(duì)程序員的承諾兩個(gè)操作存在happens-before關(guān)系,并不意味著Java平臺(tái)的具體實(shí)現(xiàn)必須按照happens-before的順序來(lái)執(zhí)行。如果重排序不改變程序執(zhí)行結(jié)果(與happens-before)規(guī)則一致,那么這種重排序是不非法的(JMM允許這種重排序)。——JMM對(duì)編譯器和處理器的束縛原則

happens-before和as-if-serial語(yǔ)義:從上述來(lái)看,happens-before和as-if-serial語(yǔ)義本質(zhì)上是一回事

as-if-serial語(yǔ)義保證單線程內(nèi)程序的執(zhí)行結(jié)果不被改變,happens-before關(guān)系保證正確同步的多線程程序的執(zhí)行結(jié)果不改變 as-if-serial語(yǔ)義給編程者一種單線程是按程序順序執(zhí)行的幻境;happens-before關(guān)系給編程者一種正確同步的多線程是按照happens-before指定的順序執(zhí)行的幻境。

兩者的目的都是為了在不改變程序執(zhí)行結(jié)果的前提下,盡可能的提高程序的執(zhí)行效率。

3、happens-before規(guī)則

《JSR-133:Java Memory Model and Thread Specification》定義了如下happens-before規(guī)則

程序順序規(guī)則 監(jiān)視器鎖規(guī)則 volatile變量規(guī)則 傳遞性 start()規(guī)則 join()規(guī)則3.1 volatile寫-讀

volatile寫-讀建立的happens-before關(guān)系

Java內(nèi)存模型之happens-before概念詳解

happens-before關(guān)系示意圖

分析上圖:

1 happens-before 2和3 happens-before 4由程序順序規(guī)則產(chǎn)生。由于編譯器和處理器遵循as-if-serial語(yǔ)義,也就是說(shuō),as-if-serial語(yǔ)義保證了程序順序規(guī)則。因此可以把程序順序規(guī)則看成是對(duì)as-if-serial語(yǔ)義的“封裝”。 2 happens-before 3 是有volatile規(guī)則產(chǎn)生。一個(gè)volatile變量的讀,總是能看到(任意線程)對(duì)這個(gè)volatile變量的最后寫入。 1 happens-before 4 是由傳遞性規(guī)則產(chǎn)生的。這里的傳遞性是由volatile的內(nèi)存屏障插入策略和volatile的編譯器重排序規(guī)則來(lái)共同保證的。3.2 start()規(guī)則

假設(shè)線程A在執(zhí)行的過(guò)程中,通過(guò)執(zhí)行ThreadB.start()來(lái)啟動(dòng)線程B;同時(shí),假設(shè)線程A在執(zhí)行ThreadB.start()之前修改了一個(gè)共享變量,線程B在執(zhí)行后會(huì)讀取這些共享變量。start()程序?qū)?yīng)的happens-before關(guān)系圖:

Java內(nèi)存模型之happens-before概念詳解

分析上圖:

1 happens-before 2 由程序順序規(guī)則產(chǎn)生2 happens-before 4 由start規(guī)則產(chǎn)生 1 happens-before 4 由傳遞性規(guī)則產(chǎn)生

因此線程A執(zhí)行ThreadB.start()之前對(duì)共享變量所做的修改,在線程B執(zhí)行后都將確保對(duì)線程B可見。

3.3 join()規(guī)則

假設(shè)線程A執(zhí)行的過(guò)程中,通過(guò)執(zhí)行ThreadB.join()來(lái)等待線程B終止;則線程B在終止之前修改了一些共享變量,線程A從ThreadB.join()返回后會(huì)讀這些共享變量。join()程序的happens-before關(guān)系圖:

Java內(nèi)存模型之happens-before概念詳解

分析上圖:

2 happens-before 4 由join()規(guī)則產(chǎn)生4 happens-before 5 由程序順序規(guī)則產(chǎn)生 2 happens-before 5 由傳遞性規(guī)則產(chǎn)生

因此線程A執(zhí)行操作ThreadB.join()并成功返回,線程B中任意操作都將對(duì)線程A可見。

文章總結(jié)至《Java并發(fā)編程藝術(shù)》,下篇總結(jié)“雙重檢查所定與延遲初始化”,敬請(qǐng)關(guān)注。

以上就是Java內(nèi)存模型之happens-before概念詳解的詳細(xì)內(nèi)容,更多關(guān)于Java內(nèi)存模型 happens-before的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 精品视频一区二区三三区四区 | 手机在线观看毛片 | 99在线免费观看视频 | 欧亚毛片| 久草视频手机在线观看 | 8050网午夜一级毛片免费不卡 | 51久久夜色精品国产 | 午夜影院免费体验 | 成人亲子乱子伦视频 | 一级毛片免费不卡在线视频 | 亚洲加勒比久久88色综合一区 | 黑人黄色毛片 | 欧美性群另类交 | 亚洲精品一级一区二区三区 | 欧美日韩精品一区二区另类 | 2000xxxxav影院 | 日本暖暖视频在线播放 | 韩国一级淫片视频免费播放 | 一区二区三区高清在线 | 中文字幕视频免费在线观看 | 日韩欧美在线视频一区二区 | 欧美日韩精品一区三区 | 欧美一级在线观看播放 | 国产精品久久九九 | 19+韩国主播青草vip视频 | 一级毛片免费观看不卡的 | 免费国产一区二区在免费观看 | 波多野结衣一区二区三区高清在线 | 国产亚洲欧洲一区二区三区 | 亚洲精品天堂一区在线观看 | 免费一级毛片在线播放 | 男人添女人下面免费毛片 | 波多结衣一区二区三区 | 国产欧美亚洲三区久在线观看 | 国产精品亚洲欧美 | 永久免费不卡在线观看黄网站 | 悠悠影院欧美日韩国产 | 一级成人a免费视频 | 手机看片福利视频 | 手机看片1024国产基地 | 精品久久一区二区三区 |