精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解 JMM 內存模型

開發
本文將著重從JMM指令規范以及如何解決程序可見性和有序性兩個問題為入口,為讀者深入剖析JMM內存模型,希望對你有幫助。

本文將著重從JMM指令規范以及如何解決程序可見性和有序性兩個問題為入口,為讀者深入剖析JMM內存模型,希望對你有幫助。

一、詳解指令重排序問題

1. 什么是重排序問題

代碼在執行過程從,計算機的不同層級為了提高最終指令執行效率,都可能會對執行響應重排序,以Java程序為例,從編譯到執行會經歷:

  • 生成指令階段:編譯器重排,該階段JMM通過禁止特定類型的編譯器重排序達到要求。
  • 處理器階段:處理器階段存在指令并行重排序和內存系統加載重排序,這種處理器級別的重排序問題,則是要求編譯器在生成指令階段通過插入內存屏障即memory barriers指令禁止特定方式重排序。

2. 編譯器重排序

編譯器(包括 JVM、JIT 編譯器等)重排序即不影響單線程執行結果的情況下,會針對性的重排代碼的效率以提高單線程情況下代碼執行效率。當然這種重排序可能也會存在一些問題,假設我們現在有這樣一段代碼:

  • 兩個CPU核心加載到一段先初始化localNum
  • 各自分別用用變量x、y讀取讀取對方的localNum的值

如下圖所示:

極端情況,假設兩個CPU都發生編譯器重排序就可能出現CPU-0先執行x=lcalNum2,CPU-1執行y=lcalNum1,因為這兩個本地變量初始化賦值指令被重排序,導致x、y最終被設置為0:

對于這種情況,JMM會針對性發生這種重排序的編譯器進行禁止來解決這種問題。

3. 指令重排序

現代的處理器會對某些指令進行重疊執行(采用指令級并行技術(Instruction-Level Parallelism,ILP),亦或者在不影響執行結果的情況下會允許Java字節碼對應的機器碼指令進行順序調換以提高單線程下代碼的執行效率,這種問題的表象和上述情況類似,這里也就不再演示了。

4. 內存重排序

該方式排序并不是真正意義上的重排序,即處理器為了提升程序的處理效率,會將內存中的數據先加載到自己的cache line上,這使得并發場景下CPU本地內存數據可能與內存中的數據不一致的情況,在JMM上常常表現為主存和本地內存的數據不一致。

如下圖,兩個CPU同時從內存中加載到x為0,然后cpu-0執行程序中的累加指令,在cpu-0未將指令下回內存時,就短暫的出現數據不一致的情況:

5. 如何避免指令重排序

這一點其實在上述各種重排序都已經簡單的說明了:

  • 對于編譯器,會禁止特定類型的編譯器重排序來避免編譯器重排序在多線程情況下帶來的問題。
  • 對于指令重排序即處理器重排序,JVM生成程序指令序列時,會根據情況插入特定的內存屏障(Memory Barrier)來相關指令來告知處理器避免特定類型的指令重排序。

二、詳解Java內存模型JMM

1. 什么是JMM模型

為了屏蔽不同操作系統之間操作系統內存模型的差異,Java定義了屬于自己的內存模型規范解決這個問題。 JMM也可以理解為針對Java并發編程的一組規范,抽象了線程和主內存之間的關系,以類似于volatile、synchronized等關鍵字以解決并發場景下重排序帶來的問題。

JMM規定所有示例對象都必須放置在主存中,所以每個線程需要操作這些數據時就需要將數據拷貝一份到本地內存中在進行相應的操作。

而每個Java將主存中拷貝的變量在完成操作后寫回主存中會經歷以下過程:

  • lock:首先將變量鎖住,將這個共享變量設置為線程獨占變量。
  • read:將主存的共享變量讀取到本地內存中。
  • load:將變量load拷貝一份到本地內存中生成共享變量的副本。
  • use:將共享變量副本放到執行引擎中。
  • assign:將共享變量副本賦值給本地內存的變量。
  • store:將變量放到主內存中
  • write:寫入主內存對應變量中
  • unlock:解鎖,該共享變量此時就可以被其他線程操作了。

同時,JMM模型還規定這些操作還得符合以下規范:

  • 線程沒有發任何assign操作的變量不可以寫回主內存中。
  • 新的變量只能在主內存中誕生。這就意味的線程中的變量必須是通過load從主存加載后再通過assign得到的。
  • 一個線程通過lock鎖定主內存變量共享變量時,這個線程可以對其上無數次鎖(即線程可重入),其他線程就不能在對其上鎖了。
  • 一個線程沒有lock一個共享變量,就不能對其進行unlock。
  • 在執行use操作前,必須清空本地內存,通過load或者assign初始化變量值才可操作本地變量。

2. JVM和JMM有什么區別

JVM規定了運行時的java程序的內存區域劃分,例如實例對象必須放置在堆區等。

而JMM則決定了線程和和主內存之間的關系,例如共享變量必須存放在主內存中。通過定義一系列規范和原則簡化用戶實現并發編程的種種操作且確保Java代碼從編譯到轉為CPU機器碼執行結果都是準確無誤的,也就是說JMM是一種內存模型語義的抽象并非實際的內存模型。

3. 什么是happens-before原則?常見的happens-before原則有哪些?

happens-before也是一種JMM內存模型用來闡述內存可見性的一種規約,對應的happens-before原則共有8條,而常見的有以下5條:

  • 程序順序規則:寫前面的變量happens-before于后面的代碼。
  • 傳遞規則:A happens-before B,B happens-before C,那么A happens-before C
  • volatile 變量規則:volatile的變量的寫操作, happens-before后續讀該變量的代碼。
  • 線程啟動規則:Thread的start都有先于后面對于該線程的操作。
  • 解鎖規則:對一個鎖的解鎖操作happens-before對這個鎖的加鎖操作

對于不會影響單線程或者多線程指令重排序操作java編譯器不做要求,即不會過分干預編譯器和處理器的大部分優化操作,例如下面這段代碼,在單線程情況下,因為兩者聲明沒有任何關聯,處理器為了提高程序執行的并行度完全可以允許其以任意順序執行,這也就是我們常說的as-if-serial,即沒有強關聯的指令,處理器可以根據自己的優化算法執行,任意重排序,對外結果好像就是串行執行一樣:

而對于某些場景, JMM對于編譯器或處理的某些會影響指令重排序的操作進行禁止,如下所示,getOne和getTwo先于最后計算,計算依賴于前兩個變量,操作即兩個get操作happens-before于最后的計算,但是兩個get操作沒有強關聯,所以JVM這兩段代碼進行指令重排序的時候,JMM是允許的,所以執行時getTwo可能會先于getOne執行。

public static void main(String[] args) {
        int one = getOne();//1
        int two = getTwo();//2
        System.out.println(one + two);//3
    }

    private static int getOne() {
        return1;
    }

    private static int getTwo() {
        return2;
    }

與之相反就是最后的計算,因為依賴于前兩個get,所以JMM模型是明確要求禁止這種情況,于是就提出了happens-before原則,即寫前面的變量happens-before于后面的代碼以及A happens-before B,B happens-before C,那么A happens-before C,按照我們的例子就是每一個get操作都會按照順序寫,因為1操作先于2先于3,所以最終執行順序就是1、2、3。

4. happens-before和JMM有什么關系

JMM原則和禁止重排序的遵循的準則都是基于 happens-before準則要求,也就是要求針對編譯器的指令重排序必須根據該準則通過某種方式落實,最常見的方式就是在生成執行指令前插入內存屏障,避免處理器進行危險的指令重排序。 所以,程序員只需理解happens-before原則的抽象即可理解可見性,由此避免去理解底層編譯器和處理器的復雜實現:

5. JMM規范如何解決處理器指令重排序問題

為了保證內存可見性,編譯器在生成指令指令序列時通過內存屏障指令來禁止特定類型的處理器重排序問題,對應的屏障指令有:

  • loadload:先加載load1先于后load2的操作,保證load1讀取的數據結果對于load2可見。
  • loadstore:load1的操作先于后store,保證store2的操作可以看見load1讀取數據的最新結果。
  • storestore:store1寫入操作先于store2,保證store1的寫入操作結果對于store2可見。
  • storeload:先store的操作對于后load可見,即store操作變量的結果對于后續的load是可見的。

而本質上這些內存屏障在硬件層也就是Load Barrier和Store Barrier兩個屏障,大體來說內存屏障的主要作用有:

  • 組織屏障前后兩個指令重排序。
  • 強制把處理器高速緩沖區數據更新結果寫回主內存,讓其它處理器中緩存數據失效,這也就是大名鼎鼎的MESI協議。

對于Load Barrier而言,若在指令錢插入Load Barrier,該屏障可讀取數據時強制要求處理器將本地cache line設置為無效,直接從內存中讀取數據:

而Store Barrier則是強制要求cpu cache line寫入操作要直接從本地cache line強制刷新到內存中讓其它核心中的cache line數據失效,而JMM規范就是基于這兩個硬件屏障的多種組合保證了操作可見性:

對于java這門語言而言,內存屏障最經典的運用無非是volatile關鍵字,可以看到下面這段代碼,為了保證volatile變量的可見性,即:

  • 在volatile寫的前后分別加入了loadstore和storeload,保證讀取依賴數據后在執行寫入并更新至主存
  • 在volatile變量讀前后分別加入loadload和loadstore保證讀取到正確的數據在執行后續的寫,即后續的寫入操作對于volatile變量可見
private staticint normalData;
    privatestaticvolatileboolean volatileData = false;// volatile確保StoreLoad語義


    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            normalData = 1;
            //插入loadload屏障,保證上述數據改變可見
            volatileData = true;
            //插入storeload屏障,保證上述數據寫入改變可見
        });

        Thread thread2 = new Thread(() -> {
            //插入loadload屏障,保證volatile讀可見之前的讀
            while (!volatileData) {
                //插入loadstore屏障,保證后續寫可見volatile變量結果
            }
            System.out.println(normalData);
        });
        thread1.start();
        thread2.start();
    }
責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2021-05-17 08:18:35

Java內存模型JMM

2009-06-24 16:50:11

Java內存模型

2025-09-08 07:14:25

2020-11-11 08:45:48

Java

2010-09-25 12:38:40

JVM內存模型

2020-10-12 08:09:39

JMM理解

2018-08-09 11:06:39

Apache Spar內存模型

2022-02-04 22:05:19

JVM程序內存模型

2018-11-01 10:34:37

JVM內存配置

2024-01-10 08:03:25

JMM重排序處理器

2018-05-18 09:07:43

Linux內核內存

2024-03-26 00:33:59

JVM內存對象

2023-11-06 07:21:13

內存結構Jvm

2024-11-18 16:37:35

JMMJava內存模型

2021-05-06 19:20:05

Java內存模型

2011-06-03 10:19:59

iphone Objective-

2018-07-04 14:43:55

對象模型內存結構內存模型

2022-10-31 11:10:49

Javavolatile變量

2010-09-27 13:48:41

JVM內存結構

2019-05-30 11:04:52

內存Spark管理
點贊
收藏

51CTO技術棧公眾號

黄色一级片在线观看| 欧美啪啪小视频| 日韩三级网址| 偷窥少妇高潮呻吟av久久免费| 精品欧美日韩| 中文在线最新版天堂| 亚洲国产老妈| 亚洲精品国产电影| 国产成人黄色网址| 日本a在线观看| 亚洲高清极品| 欧美一区二区福利在线| 久久精品国产精品亚洲色婷婷| 北岛玲一区二区三区| 国产不卡在线播放| 国产精品观看在线亚洲人成网| 欧美日韩黄色网| 蜜桃成人av| 欧美成人精品二区三区99精品| 日本精品一区二区三区四区| av在线免费网址| 国产免费成人在线视频| 国产91视觉| 一本色道久久综合熟妇| 性伦欧美刺激片在线观看| 草民午夜欧美限制a级福利片| av在线网站观看| 中文字幕久久精品一区二区| 欧美日韩激情一区二区三区| 激情六月丁香婷婷| 国产蜜臀一区二区打屁股调教| 国产精品久久久久久久久快鸭| 精品视频免费观看| 亚洲第一精品网站| 国产一区二区伦理片| 国产成人精品视频在线观看| 日韩成人免费观看| 欧美日韩午夜| 欧美成人午夜激情在线| 日本人亚洲人jjzzjjz| 亚洲动漫在线观看| 亚洲精品美女视频| 亚洲av成人片无码| 99a精品视频在线观看| 日韩一区二区免费高清| 日韩在线不卡一区| 久久婷婷五月综合色丁香| 午夜精品久久久久久久久| www.在线观看av| 18加网站在线| 亚洲精品国产精品乱码不99| 亚洲第一综合网站| 国产原创在线观看| 亚洲色图一区二区三区| 久久久国产精华液999999| 免费黄网在线观看| 亚洲免费毛片网站| 4444在线观看| 久久www人成免费看片中文| 亚洲国产精品视频| 农民人伦一区二区三区| sm在线播放| 红桃av永久久久| 国内外成人免费激情视频| 国模冰冰炮一区二区| 色偷偷成人一区二区三区91| 欧美精品aaaa| 欧美成人一二区| 91麻豆精品国产91久久久更新时间| 午夜国产福利在线观看| 日本精品一区二区三区在线观看视频| 日韩精品一区国产麻豆| 久久性爱视频网站| 台湾亚洲精品一区二区tv| 国产午夜一区二区| 五月激情婷婷在线| 国产一区二区av在线| 精品区一区二区| av无码一区二区三区| 久久综合欧美| xxx成人少妇69| 免费网站观看www在线观| 一本久久综合| 国产精品女人久久久久久| 国产免费黄色片| 99热这里都是精品| 夜夜爽99久久国产综合精品女不卡| 精品久久久免费视频| 国产.精品.日韩.另类.中文.在线.播放| 国产精品视频在线免费观看| 亚洲欧洲精品视频| 国产精品每日更新| 欧美乱大交xxxxx潮喷l头像| 婷婷综合六月| 欧美一区二区三区视频免费 | 亚洲人成网站在线观看播放| 快射视频在线观看| 欧美日韩国产在线看| 国产探花在线看| xxxx日韩| 视频直播国产精品| 日韩欧美亚洲国产| 久久丁香综合五月国产三级网站| 国产精品swag| 日韩欧美小视频| 激情成人在线视频| 五月婷婷之婷婷| 亚洲精品国产动漫| 色综合久久中文字幕综合网小说| 性无码专区无码| 国产乱码精品1区2区3区| 欧美二区三区| 精品日韩av| 欧美精品三级日韩久久| 中国美女乱淫免费看视频| 你懂的视频一区二区| 国产精品99导航| 天天操天天干天天操| 成人免费在线视频| 无码少妇一区二区三区芒果| 盗摄系列偷拍视频精品tp| 日韩在线高清视频| 中文字幕在线天堂| eeuss影院一区二区三区| 亚洲AV无码成人精品一区| 日韩免费电影| 日韩av在线不卡| 久久丫精品久久丫| 国产一区二区美女| 在线观看日韩羞羞视频| 视频在线日韩| 亚洲免费高清视频| 久久草视频在线| 成人一级片网址| 免费cad大片在线观看| 黄色成人影院| 欧美在线不卡视频| 粉嫩av蜜桃av蜜臀av| 亚洲黄色av| 国产精品免费在线播放| 色呦呦呦在线观看| 欧美一区二区三区播放老司机| 毛片久久久久久| 日本欧美加勒比视频| 日韩欧美在线一区二区| 成人爱爱网址| 亚洲色图综合久久| 人人妻人人爽人人澡人人精品| 99久久综合国产精品| 黄网站欧美内射| 牛牛视频精品一区二区不卡| 69av在线播放| 欧美性孕妇孕交| 91久久精品日日躁夜夜躁欧美| 91视频啊啊啊| 男女精品网站| 色阁综合av| www.久久热| 久久99视频精品| 亚洲精品国产精品乱码不卡| 亚洲高清免费观看| 性囗交免费视频观看| 亚洲一区观看| 色婷婷精品国产一区二区三区| 日韩成人高清| 久色乳综合思思在线视频| 精品人妻无码一区二区色欲产成人| 一区二区三区中文免费| 污污免费在线观看| 久久久夜夜夜| 永久久久久久| 动漫av一区| 日韩av电影在线网| 无遮挡的视频在线观看 | 亚洲av无码乱码国产精品| 亚洲小说欧美激情另类| 国产一级二级在线观看| 日本强好片久久久久久aaa| 亚洲在线不卡| 成人盗摄视频| 国产精品盗摄久久久| 男人和女人做事情在线视频网站免费观看| 91精品国产综合久久福利软件| 国产一级免费av| 久久久久国产一区二区三区四区| 99re精彩视频| 亚洲美女色禁图| 亚洲成人午夜在线| julia中文字幕一区二区99在线| 26uuu日韩精品一区二区| 欧美日韩在线看片| 亚洲国产天堂网精品网站| 这里只有精品免费视频| 一区二区三区在线看| 免费人成又黄又爽又色| 国产精品自拍在线| 国产v亚洲v天堂无码久久久| 自产国语精品视频| 在线视频观看国产| 欧美激情一二三区| 在线观看视频你懂得| 亚洲永久网站| 潘金莲一级淫片aaaaaa播放1| 欧美黑人做爰爽爽爽| 国产欧美在线观看| 精精国产xxxx视频在线播放| 中文字幕一区二区精品| 日本黄视频在线观看| 欧美日韩精品免费| 老熟妇仑乱一区二区av| 亚洲精品欧美二区三区中文字幕| 黄色激情在线观看| 国内成人免费视频| 日本成人中文字幕在线| 亚洲国产午夜| 超碰97免费观看| 日本一区二区高清不卡| 久久久免费看| 国产成人一二片| 91在线精品播放| 97久久网站| 欧美一级淫片丝袜脚交| 国产精品—色呦呦| 久久综合久久八八| 黄色软件在线观看| 日韩大陆毛片av| 性一交一乱一透一a级| 欧美日韩夫妻久久| 中文字幕乱码人妻无码久久| 欧美性生交xxxxx久久久| 亚洲国产综合久久| 亚洲主播在线播放| 青青操国产视频| 亚洲私人黄色宅男| 久久爱一区二区| 国产精品日产欧美久久久久| 美女爆乳18禁www久久久久久 | 在线精品一区二区三区| 国产精品一卡二| 亚洲国产综合av| 国产真实精品久久二三区| 日本不卡一区在线| 蜜臀av一区二区在线观看| 国产免费视频传媒| 久久中文字幕一区二区三区| 欧美综合在线观看视频| 老牛国产精品一区的观看方式| av网站在线观看不卡| 亚洲一区久久| 国产a级片免费观看| 久久久久看片| 九九热在线免费| 美女爽到高潮91| 思思久久精品视频| 国产一区二区三区在线观看精品| 亚洲第一区第二区第三区| 国产原创一区二区| 免费欧美一级片| 粉嫩蜜臀av国产精品网站| 88av在线播放| 91美女在线观看| 国产美女永久免费无遮挡| 中文字幕精品三区| 亚洲欧美精品aaaaaa片| 亚洲激情自拍偷拍| 免费在线观看黄网站| 色综合天天综合给合国产| 波多野结衣视频免费观看| 欧美日韩一区不卡| 99久久精品免费看国产交换| 日韩丝袜美女视频| 婷婷色在线视频| 国产一区二区日韩| a在线免费观看| 91国产中文字幕| 亚洲电影有码| 91在线观看免费观看| 奇米影视777在线欧美电影观看| 免费在线国产精品| 91久久电影| 国产无限制自拍| 日韩精品1区2区3区| 成 人 黄 色 小说网站 s色| 国产成人无遮挡在线视频| 人妻丰满熟妇av无码久久洗澡 | 黑鬼狂亚洲人videos| 亚洲一区二区偷拍精品| 男人天堂av在线播放| 欧美乱妇15p| 五月婷婷在线播放| xxxx性欧美| 免费毛片b在线观看| 国产日韩欧美影视| 日韩精品导航| 国产精品无码乱伦| 久久精品毛片| 国产伦理在线观看| 99成人精品| 鲁一鲁一鲁一鲁一av| 成人高清免费观看| 国产精品麻豆免费版现看视频| 亚洲成人你懂的| 国产一区二区在线不卡| 精品调教chinesegay| av毛片在线看| 国产精品精品国产| 狠狠久久伊人| 久久久成人精品一区二区三区| 久久久久在线| 成人欧美精品一区二区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 亚洲精品国产精品乱码视色| 精品久久人人做人人爰| 午夜视频在线| 国产成人鲁鲁免费视频a| 粉嫩av一区二区| 91嫩草国产丨精品入口麻豆| 奇米一区二区三区av| 中出视频在线观看| 亚洲国产日产av| 99re只有精品| 在线观看91久久久久久| 小草在线视频免费播放| 国产精品区免费视频| 一本一道久久a久久精品蜜桃| 天堂中文视频在线| 91免费版在线| 国产免费av一区二区| 精品国产3级a| 男插女视频久久久| 97se亚洲综合在线| 综合激情视频| 一区二区三区国产好的精华液| 中文一区二区在线观看| 波多野结衣午夜| 亚洲视频综合网| 韩日成人影院| 欧美久久久久久久| 亚洲尤物影院| 久久久久久亚洲中文字幕无码| 五月天激情小说综合| 欧洲精品久久一区二区| 久久免费视频观看| 国产成人在线中文字幕| 成人性生活视频免费看| 成人av午夜电影| 亚洲精品77777| 亚洲欧美另类自拍| av有声小说一区二区三区| 欧美一区二区综合| 日韩av在线免费观看不卡| 国产黄色大片免费看| 在线中文字幕一区二区| www.在线播放| 国产综合久久久久| 欧美一区在线看| 日本性生活一级片| 精品国产电影一区| 国产小视频在线观看| 国产精品视频一区二区高潮| 99re66热这里只有精品8| 在线播放av中文字幕| 亚洲精品乱码久久久久久黑人| 国产91免费在线观看| 91精品国产乱码久久久久久蜜臀| 亚洲欧洲免费| 91制片厂毛片| 亚洲精品日日夜夜| 天天爱天天干天天操| 国产精品吹潮在线观看| 999精品视频| 日批免费观看视频| 色综合色狠狠综合色| 思思99re6国产在线播放| 97se在线视频| 亚洲综合99| av最新在线观看| 精品国产乱码久久久久久1区2区| 性欧美18~19sex高清播放| 午夜视频久久久| 国产成人综合精品三级| 国产精品男女视频| 久久天天躁日日躁| 日韩成人av在线资源| 性欧美videossex精品| 亚洲精品菠萝久久久久久久| 日本精品专区| 91深夜福利视频| 亚久久调教视频| 日韩在线观看免| 亚洲精品97久久| 亚洲一区二区三区久久久| 国自产拍偷拍精品啪啪一区二区| 国产精品妹子av| 天天操天天干天天爱| 91免费在线视频| 性欧美暴力猛交另类hd| 黑鬼狂亚洲人videos| 国产亚洲aⅴaaaaaa毛片| 日韩中文在线|