精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

校花撩起jk露出白色内裤国产精品| 97超碰在线公开在线看免费| 日韩在线一区二区三区| 中文字幕综合在线| av不卡中文字幕| 惠美惠精品网| 一区二区在线看| 欧美成人dvd在线视频| 91女人18毛片水多国产| 日韩一级不卡| 久久久精品2019中文字幕神马| 国产在线观看免费播放| 日韩午夜视频在线| 精品露脸国产偷人在视频| 一区二区国产日产| 污污网站在线免费观看| 国产一区二三区好的| 日韩av手机在线看| 久久免费黄色网址| 91九色精品| 国产午夜精品免费一区二区三区| 亚洲丝袜在线观看| 日本国产亚洲| 91搞黄在线观看| 国产原创中文在线观看| 2024最新电影免费在线观看| 国产精品午夜在线观看| 国产伦精品一区二区三区高清版 | 色视频欧美一区二区三区| 蜜桃视频一区二区在线观看| 91官网在线| 久久精品一区二区三区av| 国产精品10p综合二区| 国产精品久久久久久在线| 日韩高清不卡在线| 热久久这里只有精品| 日本熟妇乱子伦xxxx| 欧美午夜在线视频| 欧美成人免费视频| 午夜剧场免费在线观看| 日韩国产一区| 日韩在线中文字幕| 日韩福利在线视频| 欧美日韩国产传媒| 一区二区三区久久精品| 亚洲熟妇无码av| 538任你躁精品视频网免费| 欧美精品视频www在线观看| 亚洲36d大奶网| a∨色狠狠一区二区三区| 欧美性xxxxx极品少妇| 成熟老妇女视频| 超级碰碰久久| 色哟哟日韩精品| 99视频在线免费| 日韩av超清在线观看| 色婷婷久久一区二区三区麻豆| 131美女爱做视频| 川上优av中文字幕一区二区| 精品国产91久久久久久老师| 99色这里只有精品| 电影在线观看一区| 一本一道波多野结衣一区二区| 日本成年人网址| 综合在线影院| 欧美日韩亚洲另类| 成人高清在线观看视频| 亚洲1区在线观看| 日韩精品视频免费专区在线播放| 亚洲精品在线视频免费观看| 九九亚洲视频| 日韩一区二区福利| 五月天丁香激情| 99riav1国产精品视频| 国产成人一区二区| 亚洲一区二区人妻| 国产米奇在线777精品观看| 成人毛片网站| 蜜桃视频在线观看视频| 中文字幕欧美一| 免费极品av一视觉盛宴| 成人影院在线视频| 欧美日韩国产精品自在自线| 精产国品一区二区三区| 色综合www| 中文字幕少妇一区二区三区| 日韩va亚洲va欧美va清高| 亚洲国产裸拍裸体视频在线观看乱了中文 | 一区二区在线不卡| 色帝国亚洲欧美在线| 欧美性xxxx在线播放| 手机av在线网| 久久久久高潮毛片免费全部播放| 一区二区三区亚洲| avove在线播放| 久久深夜福利| 99久久无色码| 国产福利在线| 亚洲电影一级黄| 久久撸在线视频| 卡通动漫国产精品| 久久精品色欧美aⅴ一区二区| 久久狠狠高潮亚洲精品| 久久99在线观看| 久久伊人一区二区| 91麻豆免费在线视频| 日本高清不卡在线观看| 无码人妻一区二区三区一| 精品久久精品| 国产69久久精品成人| 国产精品一区二区人人爽| 久久综合久久综合九色| 国产成人一二三区| 欧美一区=区三区| 亚洲免费一在线| 久久免费在线观看视频| 久久激情五月婷婷| 欧美日韩在线精品| wwwww亚洲| 日韩一区和二区| 精品视频第一页| 久久一区亚洲| 精品免费二区三区三区高中清不卡| 国产二区三区在线| 欧美日韩视频第一区| 中文字幕免费高清| 国产亚洲网站| 国产欧美日韩一区二区三区| 在线免费观看a视频| 精品视频999| av电影在线不卡| 久久99伊人| 精品久久久久久中文字幕动漫| 国产精品一卡二卡三卡| 欧美美女bb生活片| av黄色免费在线观看| 免费成人在线观看| 四虎一区二区| 黄色成人在线视频| 一区二区三区无码高清视频| 中文字幕一区二区人妻视频| 91亚洲午夜精品久久久久久| 激情伊人五月天| 国产另类在线| 91精品国产九九九久久久亚洲| 懂色av成人一区二区三区| 亚洲精品菠萝久久久久久久| 999热精品视频| 欧美福利专区| 粉嫩av免费一区二区三区| 美洲精品一卡2卡三卡4卡四卡| 日韩精品资源二区在线| 精品少妇theporn| 成人做爰69片免费看网站| 欧美中文字幕在线观看视频| 福利在线一区| 97人人模人人爽人人喊中文字| 日本xxxxxwwwww| 欧美日韩国产综合视频在线观看中文| 日本少妇xxxx| 校园激情久久| 一区国产精品| 日韩av综合| 91黑丝在线观看| 欧美成人片在线| 在线观看日产精品| 91精品一区二区三区蜜桃| 国产成a人无v码亚洲福利| 日韩视频在线视频| 啪啪亚洲精品| 91精品视频网站| av美女在线观看| 亚洲日本欧美中文幕| 中文字字幕在线中文乱码| 亚洲免费大片在线观看| 理论片大全免费理伦片| 久久蜜桃精品| 99热都是精品| 日韩大尺度在线观看| 国产精品黄页免费高清在线观看| 激情视频在线观看| 亚洲精品ady| 一级片视频免费| 亚洲成人免费视| 久久久久久久毛片| 成人综合在线网站| 亚洲一级片免费| 在线欧美福利| 亚洲美女网站18| 国产调教精品| 国产欧美一区二区三区久久人妖 | 久久国产精品亚洲人一区二区三区| 成人欧美一区二区三区在线湿哒哒| 三级网站视频在在线播放| 亚洲欧美999| 性生交大片免费看女人按摩| 日韩欧美大尺度| 欧美日韩大片在线观看| 国产午夜精品在线观看| 丰满岳乱妇一区二区| 麻豆精品一二三| 日本www在线视频| 一区二区三区在线| 日本一区二区三区视频在线播放| 日韩欧美中文字幕一区二区三区 | 男人添女荫道口图片| 欧美mv日韩| 欧美国产二区| 97se亚洲| 91在线免费看网站| 播放一区二区| 欧洲成人在线视频| aa视频在线观看| 欧美精品做受xxx性少妇| yiren22综合网成人| 国产网站欧美日韩免费精品在线观看| 99久久一区二区| 欧美另类变人与禽xxxxx| 色av性av丰满av| 五月天视频一区| 久久久一区二区三区四区| 亚洲人成伊人成综合网小说| 精品成人无码一区二区三区| 91丨porny丨国产| 欧美久久久久久久久久久| 国产在线一区二区| 久久黄色片网站| 免费成人在线影院| www.com黄色片| 日本成人中文字幕| 国产天堂在线播放| 视频一区中文字幕| 国产成人综合一区| 久久久久欧美精品| 欧在线一二三四区| 久久精品道一区二区三区| 精品中文字幕av| 国产亚洲在线| 欧美s码亚洲码精品m码| 国产亚洲亚洲| 黄色片久久久久| 日韩一区精品视频| 不卡av免费在线| 免费观看久久久4p| 鲁一鲁一鲁一鲁一av| 久久综合综合久久综合| 在线观看国产中文字幕| 精品一区二区在线观看| 在线播放av中文字幕| 黄色小说综合网站| 久久精品一卡二卡| 国产麻豆精品95视频| 九色91porny| 成人免费视频caoporn| 人妖粗暴刺激videos呻吟| 99re在线精品| www.狠狠爱| 中文无字幕一区二区三区| 成年人视频软件| 亚洲精品国产高清久久伦理二区| 欧美性猛交xxxxx少妇| 亚洲精品菠萝久久久久久久| 精品无码人妻一区二区三区| 五月婷婷综合在线| 无码任你躁久久久久久久| 欧美三级欧美一级| 99精品在线看| 亚洲加勒比久久88色综合| 三级在线视频| 日韩有码片在线观看| 182tv在线播放| 2019av中文字幕| 国产精品高潮久久| 成人黄视频免费| 蜜桃一区二区三区| 在线无限看免费粉色视频| 一区二区亚洲精品| 亚洲老女人av| 成人性视频免费网站| 西西444www无码大胆| 最新热久久免费视频| 国产一级aa大片毛片| 91极品视觉盛宴| www.av在线.com| 亚洲老板91色精品久久| 久久综合网导航| 91国产美女在线观看| 日日狠狠久久| 久久精品二区| 66国产精品| 男女午夜激情视频| 国产乱子伦视频一区二区三区| 超碰男人的天堂| 国产精品不卡在线| 国语对白永久免费| 日韩三级视频在线看| 国产午夜在线观看| 久久久亚洲国产天美传媒修理工| 黄色精品视频| 狠狠色综合欧美激情| 久久久久久久久久久妇女 | 香蕉成人av| 国产精品高清一区二区三区| 日韩精品二区| 国内外免费激情视频| www.av精品| 免费又黄又爽又色的视频| 欧美人xxxx| 国产视频第一区| 97精品一区二区三区| 精品国产亚洲一区二区三区在线 | 亚洲精品乱码| 一级黄色免费毛片| 国产精品色哟哟| 国产suv精品一区二区33| 亚洲精品在线观| av电影高清在线观看| 国产精品永久免费| 自拍亚洲一区| 1024av视频| 成人国产亚洲欧美成人综合网| 卡通动漫亚洲综合| 精品视频在线免费| 国产黄色片在线播放| 人人澡人人澡人人看欧美| 加勒比色老久久爱综合网| 日韩成人三级视频| 国产成人免费网站| 精品一区在线观看视频| 911精品国产一区二区在线| www.在线播放| 国产精品久久久久久久久影视| 自拍欧美一区| 欧美一级片中文字幕| 97精品久久久久中文字幕| 国产午夜福利片| 精品国产乱码久久久久久闺蜜| 亚洲精品白浆| 51成人做爰www免费看网站| 国产精品99久久久久久动医院| 欧美美女一级片| 中文字幕在线播放不卡一区| 一级黄色大片网站| 久久久av一区| 欧美一级大片在线视频| 欧美a级黄色大片| 国产精品一区二区无线| 久操免费在线视频| 亚洲精品一区二区三区蜜桃下载| 青草av在线| 国产午夜精品在线| 性欧美精品高清| 国产熟女一区二区| 欧美日韩国产在线观看| 黄在线免费看| 国产精品久久久久久久天堂第1集| 国内揄拍国内精品久久| 性色av蜜臀av浪潮av老女人| 欧美日韩国产综合新一区| 岛国在线大片| 91精品视频大全| 亚洲国产午夜| av网站免费在线看| 欧美精品xxxxbbbb| 青春草在线免费视频| 欧美另类高清视频在线| 蜜臀99久久精品久久久久久软件| 欧美大片xxxx| 亚洲精品suv精品一区二区| 国产在线看片免费视频在线观看| 欧美中日韩免费视频| 久久99精品久久久久久| 麻豆91精品91久久久| 日韩精品中文字幕久久臀| 成人综合网站| 久久在线中文字幕| 久久精品欧美一区二区三区不卡| 在线免费观看高清视频| 欧美黑人一区二区三区| 国产精品嫩草影院在线看| 一区二区三区四区毛片| 精品欧美一区二区三区| 成年在线观看免费人视频| 99三级在线| 天堂蜜桃91精品| 九九视频免费看| 亚洲新中文字幕| 99久久香蕉| 超碰在线播放91| 天天综合网 天天综合色| 美女国产在线| 欧美一区1区三区3区公司 | 国产成人精品福利一区二区三区 | 亚洲第一在线| 成人性视频免费看| 亚洲激情视频网站| 在线视频成人| 成年人在线看片| 亚洲午夜一区二区| 在线中文资源天堂|