日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

《深入理解 Java 内存模型》读书笔记(下)(干货,万字长文)

發(fā)布時(shí)間:2025/3/21 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《深入理解 Java 内存模型》读书笔记(下)(干货,万字长文) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 0. 前提

  • 1. 基礎(chǔ)

  • 2. 重排序

  • 3. 順序一致性

  • 4. Volatile

  • 5. 鎖

  • 6. final

  • 7. 總結(jié)


4. Volatile

4.1 VOLATILE 特性

舉個(gè)例子:

public?class?VolatileTest?{volatile?long?a?=?1L;?????????//?使用?volatile?聲明?64?位的?long?型public?void?set(long?l)?{a?=?l;??????????????????//單個(gè)?volatile?變量的寫}public?long?get()?{return?a;???????????????//單個(gè)?volatile?變量的讀}public?void?getAndIncreament()?{a++;????????????????????//?復(fù)合(多個(gè))?volatile?變量的讀?/寫} }

假設(shè)有多個(gè)線程分別調(diào)用上面程序的三個(gè)方法,這個(gè)程序在語義上和下面程序等價(jià):

public?class?VolatileTest?{long?a?=?1L;?????????????????//?64?位的?long?型普通變量public?synchronized?void?set(long?l)?{????//對(duì)單個(gè)普通變量的寫用同一個(gè)鎖同步a?=?l;????????????????}public?synchronized?long?get()?{????????//對(duì)單個(gè)普通變量的讀用同一個(gè)鎖同步return?a;???????????}public?void?getAndIncreament()?{????????//普通方法調(diào)用long?temp?=?get();??????????????????//調(diào)用已同步的讀方法temp?+=?1L;????????????????????????????//普通寫操作?????????????????????????set(temp);??????????????????????????//調(diào)用已同步的寫方法} }

如上面示例程序所示,對(duì)一個(gè) volatile 變量的單個(gè)讀/寫操作,與對(duì)一個(gè)普通變量的讀/寫操作使用同一個(gè)鎖來同步,它們之間的執(zhí)行效果相同。

鎖的 happens-before 規(guī)則保證釋放鎖和獲取鎖的兩個(gè)線程之間的內(nèi)存可見性,這意味著對(duì)一個(gè) volatile 變量的讀,總是能看到(任意線程)對(duì)這個(gè) volatile 變量最后的寫入

鎖的語義決定了臨界區(qū)代碼的執(zhí)行具有原子性。這意味著即使是 64 位的 long 型和 double 型變量,只要它是 volatile變量,對(duì)該變量的讀寫就將具有原子性。如果是多個(gè) volatile 操作或類似于 volatile++ 這種復(fù)合操作,這些操作整體上不具有原子性

簡而言之,volatile 變量自身具有下列特性:

  • 可見性。對(duì)一個(gè) volatile 變量的讀,總是能看到(任意線程)對(duì)這個(gè) volatile 變量最后的寫入。

  • 原子性:對(duì)任意單個(gè) volatile 變量的讀/寫具有原子性,但類似于 volatile++ 這種復(fù)合操作不具有原子性。

4.2 VOLATILE 寫-讀的內(nèi)存定義

  • 當(dāng)一個(gè) volatile 變量時(shí),JMM 會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的共享變量值刷新到主內(nèi)存。

  • 當(dāng)一個(gè) volatile 變量時(shí),JMM 會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存置為無效。線程接下來將從主內(nèi)存中讀取共享變量。

假設(shè)上面的程序 flag 變量用 volatile 修飾

volatile1

4.3 VOLATILE 內(nèi)存語義的實(shí)現(xiàn)

下面是 JMM 針對(duì)編譯器制定的 volatile 重排序規(guī)則表:

重排序規(guī)則表

為了實(shí)現(xiàn) volatile 的內(nèi)存語義,編譯器在生成字節(jié)碼時(shí),會(huì)在指令序列中插入內(nèi)存屏障來禁止特定類型的處理器重排序。

下面是基于保守策略的 JMM 內(nèi)存屏障插入策略:

  • 在每個(gè) volatile 寫操作的前面插入一個(gè) StoreStore 屏障。

  • 在每個(gè) volatile 寫操作的后面插入一個(gè) StoreLoad 屏障。

  • 在每個(gè) volatile 讀操作的后面插入一個(gè) LoadLoad 屏障。

  • 在每個(gè) volatile 讀操作的后面插入一個(gè) LoadStore 屏障。

下面是保守策略下,volatile 寫操作 插入內(nèi)存屏障后生成的指令序列示意圖:

volatile3

下面是在保守策略下,volatile 讀操作 插入內(nèi)存屏障后生成的指令序列示意圖:

volatile4

上述 volatile 寫操作和 volatile 讀操作的內(nèi)存屏障插入策略非常保守。在實(shí)際執(zhí)行時(shí),只要不改變 volatile 寫-讀的內(nèi)存語義,編譯器可以根據(jù)具體情況省略不必要的屏障。

5.1 鎖

5.2 鎖釋放和獲取的內(nèi)存語義

當(dāng)線程釋放鎖時(shí),JMM 會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存中。

當(dāng)線程獲取鎖時(shí),JMM 會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存置為無效。從而使得被監(jiān)視器保護(hù)的臨界區(qū)代碼必須要從主內(nèi)存中去讀取共享變量。

5.3 鎖內(nèi)存語義的實(shí)現(xiàn)

借助 ReentrantLock 來講解,PS: 后面專門講下這塊(ReentrantLock、Synchronized、公平鎖、非公平鎖、AQS等),可以看看大明哥的博客:http://cmsblogs.com/?p=2210

5.4 CONCURRENT 包的實(shí)現(xiàn)

如果我們仔細(xì)分析 concurrent 包的源代碼實(shí)現(xiàn),會(huì)發(fā)現(xiàn)一個(gè)通用化的實(shí)現(xiàn)模式:

  • 首先,聲明共享變量為 volatile;

  • 然后,使用 CAS 的原子條件更新來實(shí)現(xiàn)線程之間的同步;

  • 同時(shí),配合以 volatile 的讀/寫和 CAS 所具有的 volatile 讀和寫的內(nèi)存語義來實(shí)現(xiàn)線程之間的通信。

  • AQS,非阻塞數(shù)據(jù)結(jié)構(gòu)和原子變量類(java.util.concurrent.atomic 包中的類),這些 concurrent 包中的基礎(chǔ)類都是使用這種模式來實(shí)現(xiàn)的,而 concurrent 包中的高層類又是依賴于這些基礎(chǔ)類來實(shí)現(xiàn)的。從整體來看,concurrent 包的實(shí)現(xiàn)示意圖如下:

    concurrent 包

    6. final

    對(duì)于 final 域,編譯器和處理器要遵守兩個(gè)重排序規(guī)則:

  • 在構(gòu)造函數(shù)內(nèi)對(duì)一個(gè) final 域的寫入,與隨后把這個(gè)被構(gòu)造對(duì)象的引用賦值給一個(gè)引用變量,這兩個(gè)操作之間不能重排序。

  • 初次讀一個(gè)包含 final 域的對(duì)象的引用,與隨后初次讀這個(gè) final 域,這兩個(gè)操作之間不能重排序。

  • 6.1 寫 FINAL 域的重排序規(guī)則

    寫 final 域的重排序規(guī)則禁止把 final 域的寫重排序到構(gòu)造函數(shù)之外。這個(gè)規(guī)則的實(shí)現(xiàn)包含下面2個(gè)方面:

    • JMM 禁止編譯器把 final 域的寫重排序到構(gòu)造函數(shù)之外。

    • 編譯器會(huì)在 final 域的寫之后,構(gòu)造函數(shù) return 之前,插入一個(gè) StoreStore 屏障。這個(gè)屏障禁止處理器把 final 域的寫重排序到構(gòu)造函數(shù)之外。

    6.2 讀 FINAL 域的重排序規(guī)則

    在一個(gè)線程中,初次讀對(duì)象引用與初次讀該對(duì)象包含的 final 域,JMM 禁止處理器重排序這兩個(gè)操作(注意,這個(gè)規(guī)則僅僅針對(duì)處理器)。編譯器會(huì)在讀 final 域操作的前面插入一個(gè) LoadLoad 屏障。

    6.3 FINAL 域是引用類型

    對(duì)于引用類型,寫 final 域的重排序規(guī)則對(duì)編譯器和處理器增加了如下約束:

    在構(gòu)造函數(shù)內(nèi)對(duì)一個(gè) final 引用的對(duì)象的成員域的寫入,與隨后在構(gòu)造函數(shù)外把這個(gè)被構(gòu)造對(duì)象的引用賦值給一個(gè)引用變量,這兩個(gè)操作之間不能重排序。

    7. 總結(jié)

    7.1 JMM,處理器內(nèi)存模型與順序一致性內(nèi)存模型之間的關(guān)系

    JMM 是一個(gè)語言級(jí)的內(nèi)存模型,處理器內(nèi)存模型是硬件級(jí)的內(nèi)存模型,順序一致性內(nèi)存模型是一個(gè)理論參考模型。下面是語言內(nèi)存模型,處理器內(nèi)存模型和順序一致性內(nèi)存模型的強(qiáng)弱對(duì)比示意圖:

    內(nèi)存模型比較

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

    jmm

    7.3 JMM 的內(nèi)存可見性保證

    Java 程序的內(nèi)存可見性保證按程序類型可以分為下列三類:

    1.單線程程序。單線程程序不會(huì)出現(xiàn)內(nèi)存可見性問題。編譯器,runtime 和處理器會(huì)共同確保單線程程序的執(zhí)行結(jié)果與該程序在順序一致性模型中的執(zhí)行結(jié)果相同。

    2.正確同步的多線程程序。正確同步的多線程程序的執(zhí)行將具有順序一致性(程序的執(zhí)行結(jié)果與該程序在順序一致性內(nèi)存模型中的執(zhí)行結(jié)果相同)。這是 JMM 關(guān)注的重點(diǎn),JMM通過限制編譯器和處理器的重排序來為程序員提供內(nèi)存可見性保證。

    3.未同步/未正確同步的多線程程序。JMM 為它們提供了最小安全性保障:線程執(zhí)行時(shí)讀取到的值,要么是之前某個(gè)線程寫入的值,要么是默認(rèn)值(0,null,false)。

    下圖展示了這三類程序在 JMM 中與在順序一致性內(nèi)存模型中的執(zhí)行結(jié)果的異同:

    總結(jié)

    以上是生活随笔為你收集整理的《深入理解 Java 内存模型》读书笔记(下)(干货,万字长文)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久草av | 免费三片在线观看网站v888 | 最近中文字幕mv免费高清在线 | 国产黄a三级三级三级看三级男男 | av网站地址 | 911亚洲精选 | 精品欧美一区二区久久久久 | 麻豆精品免费视频 | 欧美亚洲精品一区 | 日韩精品久久久久 | 骚虎视频在线观看 | 免费av小说 | 加勒比毛片 | 99无码熟妇丰满人妻啪啪 | 五月婷六月| 动漫玉足吸乳羞免费网站玉足 | 视频国产精品 | 欧美黑吊大战白妞 | 久久久国产精品一区 | 亚洲视频网站在线 | 欧美精品不卡 | 国产第一页屁屁影院 | 欧美成人午夜剧场 | 日韩av一区二区在线 | 美梦视频大全在线观看高清 | 8x8ⅹ成人永久免费视频 | 日本五十路女优 | 国产人妻精品一区二区三区不卡 | 五月天婷婷在线播放 | 精品无码国产污污污免费网站 | 九九热综合 | 午夜福利啪啪片 | 蜜臀久久99精品久久久久久宅男 | 国产一区二区精品在线观看 | 一区二区三区免费观看 | 国产视频第一区 | 波多野结衣视频免费看 | 巨骚综合| av性色 | av男人的天堂在线 | 一个人看的www视频在线观看 | 天天碰天天操 | 看全色黄大色黄女片18 | 亚洲av色香蕉一区二区三区 | 亚洲综合精品国产一区二区三区 | a三级黄色片 | 久久精品一区二区国产 | 老司机午夜免费精品视频 | 亚洲精品视频一区二区三区 | 国产91精品久久久久久久 | 打开免费观看视频在线 | 男男啪啪网站 | 精品无人国产偷自产在线 | 中日韩在线 | 久久久久国产精品夜夜夜夜夜 | 成人av手机在线观看 | 91亚洲在线 | 午夜久久久久久久久久久 | 男人操女人视频网站 | 欧美日韩在线中文字幕 | 自拍偷拍第一页 | 国产一区不卡视频 | 欧洲mv日韩mv国产 | 奇米影视av | 91精品国产综合久久精品图片 | 久久99精品久久久水蜜桃 | 国产精品久久一区二区三区动 | 欧美片网站yy | 91精品国产综合久久国产大片 | 成人黄色一级片 | 日本做受 | 成人激情小说网站 | 亚洲av综合色区无码另类小说 | 国产视频一区三区 | 五月av| 免费黄网站在线观看 | 欧美精品第一页 | 国产精品视频导航 | 国产伦理久久精品久久久久 | 私库av在线| 男人的天堂网在线 | 国产欧美一区二区三区四区 | 377人体粉嫩噜噜噜 www.av黄色 | 日本美女啪啪 | 日韩在线一二三区 | 91在线观看免费高清 | 国产精品一区二区入口九绯色 | 欧美日韩视频无码一区二区三 | 玖玖综合网| 久久发布国产伦子伦精品 | 九一在线视频 | 无码国产精品一区二区免费式直播 | 91日韩一区二区 | 男女视频国产 | 波多野结衣1区2区3区 | 欧美国产二区 | 久久福利视频导航 | 成人h动漫精品一区二区无码 | 国产观看 |