Java內存模型(七)happens-before

      網友投稿 633 2025-03-31

      簡介


      happens-before是JMM的核心概念。理解happens-before是了解JMM的關鍵。

      1、設計意圖

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

      程序員角度,希望內存模型易于理解、易于編程。希望是一個強內存模型。

      編譯器和處理器角度,希望減少對它們的束縛,以至于編譯器和處理器可以做更多的性能優化。希望是一個弱內存模型。

      因此JSR-133專家組設計JMM的核心目標就兩個:

      為程序員提供足夠強的內存模型

      對編譯器和處理器的限制盡可能少

      下面通過一段代碼來看JSR-133如何實現這兩個目標:

      double pi = 3.14; //A double r = 1.0; //B double area = pi * r * r //C

      上述代碼存在如下happens-before關系:

      A happens-before B

      B happens-before C

      A happens-before C

      這3個happens-before關系中,第二個和第三個是必須的,而第一個是非必須的(A、B操作之間重排序,程序執行結果不會發生改變)。

      JMM把happens-before要求禁止的重排序分為下面的兩類:

      會改變程序執行結果的重排序

      不會改變程序執行結果的重排序

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

      對于會改變程序執行結果的重排序,JMM要求編譯器和處理器必須禁止

      對于不會改變程序執行結果的重排序,JMM不做要求(JMM運行)

      JMM設計示意圖:

      JMM設計示意圖

      Java內存模型(七)happens-before

      總結:

      JMM給程序員提供的happens-before規則能滿足程序員的需求。簡單易懂,具有足夠強的內存可見性保證。

      JMM對編譯器和處理器的束縛盡可能少。遵循的原則是:不改變程序的執行結果(正確同步或單線程執行),編譯器和處理器可以任意優化。

      2、happens-before的定義

      起源:

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

      Java中的應用:

      JSR-133使用happens-before來指定兩個操作之間的執行順序。JMM可以通過happens-before關系向程序員提供跨線程的內存可見性保證。

      《JSR-133:Java Memory Model and Thread Specification》對happens-before關系的定義如下:

      如果操作A happens-before 操作B,那么A操作的執行結果將會對操作B可見,且操作A的執行順序排在操作B之前——JMM對程序員的承諾

      兩個操作存在happens-before關系,并不意味著Java平臺的具體實現必須按照happens-before的順序來執行。如果重排序不改變程序執行結果(與happens-before)規則一致,那么這種重排序是不非法的(JMM允許這種重排序)。——JMM對編譯器和處理器的束縛原則

      happens-before和as-if-serial語義:

      從上述來看,happens-before和as-if-serial語義本質上是一回事

      as-if-serial語義保證單線程內程序的執行結果不被改變,happens-before關系保證正確同步的多線程程序的執行結果不改變

      as-if-serial語義給編程者一種單線程是按程序順序執行的幻境;happens-before關系給編程者一種正確同步的多線程是按照happens-before指定的順序執行的幻境。

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

      3、happens-before規則

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

      程序順序規則

      監視器鎖規則

      volatile變量規則

      傳遞性

      start()規則

      join()規則

      volatile寫-讀建立的happens-before關系

      happens-before關系示意圖

      分析上圖:

      1 happens-before 2和3 happens-before 4由程序順序規則產生。由于編譯器和處理器遵循as-if-serial語義,也就是說,as-if-serial語義保證了程序順序規則。因此可以把程序順序規則看成是對as-if-serial語義的“封裝”。

      2 happens-before 3 是有volatile規則產生。一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量的最后寫入。

      1 happens-before 4 是由傳遞性規則產生的。這里的傳遞性是由volatile的內存屏障插入策略和volatile的編譯器重排序規則來共同保證的。

      假設線程A在執行的過程中,通過執行ThreadB.start()來啟動線程B;同時,假設線程A在執行ThreadB.start()之前修改了一個共享變量,線程B在執行后會讀取這些共享變量。

      start()程序對應的happens-before關系圖:

      分析上圖:

      1 happens-before 2 由程序順序規則產生

      2 happens-before 4 由start規則產生

      1 happens-before 4 由傳遞性規則產生

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

      假設線程A執行的過程中,通過執行ThreadB.join()來等待線程B終止;則線程B在終止之前修改了一些共享變量,線程A從ThreadB.join()返回后會讀這些共享變量。

      join()程序的happens-before關系圖:

      分析上圖:

      2 happens-before 4 由join()規則產生

      4 happens-before 5 由程序順序規則產生

      2 happens-before 5 由傳遞性規則產生

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

      文章總結至《Java并發編程藝術》,下篇總結“雙重檢查所定與延遲初始化”,敬請關注。

      Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps2019單元格數據怎么分列?wps2019分列數據教程
      下一篇:商家對訂單的處理流程(商家訂貨)
      相關文章
      亚洲一区二区三区首页| 久久亚洲精品成人综合| 亚洲性天天干天天摸| 苍井空亚洲精品AA片在线播放| 亚洲AV电影院在线观看| 在线精品亚洲一区二区小说| 亚洲AV无码一区二区三区在线观看 | 亚洲天堂中文资源| 久久久久亚洲AV成人无码| 亚洲乱码无码永久不卡在线| 亚洲性日韩精品国产一区二区| 亚洲国产精品成人AV在线| 亚洲人成电影网站色| 亚洲人成电影网站久久| 中文字幕亚洲情99在线| 亚洲天天在线日亚洲洲精| 亚洲AV无码成人精品区天堂| 亚洲国产精品成人网址天堂| 少妇亚洲免费精品| 天堂亚洲免费视频| 亚洲人成网站在线观看青青| 国产精品亚洲精品日韩已方| 亚洲婷婷五月综合狠狠爱| 亚洲自偷自偷图片| 亚洲国产精品高清久久久| 久久精品亚洲视频| 亚洲激情视频网站| 亚洲av永久综合在线观看尤物 | 亚洲伊人久久综合影院| 日韩一卡2卡3卡4卡新区亚洲| 久久精品夜色噜噜亚洲A∨| 亚洲国产一二三精品无码| 亚洲AV无码精品无码麻豆| 亚洲黄色免费网址| 亚洲人成综合在线播放| 亚洲色丰满少妇高潮18p| 国产亚洲人成在线播放| 亚洲综合国产精品第一页| 亚洲精品字幕在线观看| 色噜噜综合亚洲av中文无码| 亚洲一区电影在线观看|