最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

學(xué)習(xí)Java內(nèi)存模型JMM心得

 更新時間:2017年12月22日 09:15:59   作者:鐘紹威  
這篇文章主要介紹了學(xué)習(xí)Java內(nèi)存模型JMM的心得以及對其原理做了深入的介紹,有興趣的朋友學(xué)習(xí)下吧。

有時候編譯器、處理器的優(yōu)化會導(dǎo)致runtime與我們設(shè)想的不一樣,為此Java對編譯器和處理器做了一些限制,JAVA內(nèi)存模型(JMM)將這些抽象出來,這樣編寫代碼時就無需考慮那么多底層細(xì)節(jié),并保證“只要遵循JMM的規(guī)則編寫程序,其運(yùn)行結(jié)果一定是正確的”。

JMM的抽象結(jié)構(gòu)

在Java中,所有的實(shí)例、靜態(tài)變量存儲在堆內(nèi)存中,堆內(nèi)存是可以在線程間共享的,這部分也稱為共享變量。而局部變量、方法定義參數(shù)、異常處理參數(shù)是在棧中的,棧內(nèi)存不在線程間共享。

而由于編譯器、處理器的優(yōu)化,會導(dǎo)致共享變量出現(xiàn)可見性問題,像在多核處理器中(multi-processor),線程可以在不同的處理器上執(zhí)行,而處理器之間緩存不一致,會使共享變量出現(xiàn)可見性問題,有可能兩個線程看到同一個變量不同值。

JMM將這些硬件做的優(yōu)化抽象成每個線程都有一個本地內(nèi)存。需要讀寫共享變量時,從主內(nèi)存中拷貝一份到本地內(nèi)存。當(dāng)寫共享變量時,先寫到本地內(nèi)存中去,在將來某個時間再刷新到主內(nèi)存中。當(dāng)再次讀共享變量時,則只會從本地內(nèi)存中讀取。

這樣線程間通訊就需要經(jīng)過兩步:

寫線程:刷新本地內(nèi)存到主內(nèi)存中去讀線程:從主內(nèi)存讀取更新后的值

這樣在寫-讀之間就有一個延遲:本地內(nèi)存什么時候刷新到主內(nèi)存中去?導(dǎo)致可見性問題,不同線程可能看到的共享變量不一樣。

happens-before

從字面上看happens-before的意思是“發(fā)生在此之前”。這是java對程序執(zhí)行順序制定的規(guī)則,實(shí)現(xiàn)同步必須遵循該規(guī)則。這樣程序員只需要寫出正確的同步程序,happens-before保證運(yùn)行結(jié)果不會錯。

A happens-before B,不僅僅表示A在B之前執(zhí)行,還意味著A的執(zhí)行結(jié)果對B可見,這保證了可見性。

A happens-before B,A也不一定要在B之前執(zhí)行,如果AB交替,執(zhí)行結(jié)果任然正確,則允許編譯器、處理器進(jìn)行優(yōu)化重排序。所以只要程序結(jié)果正確,編譯器、處理器怎么優(yōu)化,怎么重排序都沒問題,都是好的。

happens-before規(guī)則

程序順序規(guī)則:在一個線程中,前面的操作happens-before后面的操作鎖規(guī)則:對同一個鎖,解鎖happens-before加鎖 volatile域規(guī)則:寫volatile變量,happens-before后面任意一個讀這個volatile變量的操作傳遞性:A happens-before B,B happens-before C,則A happens-before C start()規(guī)則:如果線程A執(zhí)行ThreadB.start() 那么ThreadB.start() happens-before 線程B中任何操作 join()規(guī)則:如果線程A執(zhí)行ThreadB.join(),那么線程B中的所有操作happens-before ThreadB.join()

下面這個示例有助于理解happens-before

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

這里有三個happens-before關(guān)系,規(guī)則1、2是程序順序規(guī)則,規(guī)則3是傳遞性規(guī)則推導(dǎo)出來的:

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

C依賴于A、B,但是A和B誰也不依賴。所以即使A和B重排序,執(zhí)行結(jié)果也不會發(fā)生變化,這種重排序,JMM是運(yùn)行的。

下面兩種執(zhí)行順序的結(jié)果都是正確的。

以上就是我們給大家整理的關(guān)于Java內(nèi)存模型JMM學(xué)習(xí)心得的全部內(nèi)容,更多問題大家可以在下方留言討論,感謝你對腳本之家的支持。

相關(guān)文章

  • Java和C語言分別實(shí)現(xiàn)水仙花數(shù)及拓展代碼

    Java和C語言分別實(shí)現(xiàn)水仙花數(shù)及拓展代碼

    這篇文章主要介紹了分別用Java和C語言實(shí)現(xiàn)水仙花數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • Spring 加載多個xml配置文件的原理分析

    Spring 加載多個xml配置文件的原理分析

    我們知道Spring一次可以加載多個Bean定義的Xml配置文件,我們可以設(shè)想下如果讓我們來做我們會怎么做?我估計(jì)會根據(jù)配置文件的順序依次讀取并加載,那再來看看Spring是如何做的?
    2021-06-06
  • 解決日期轉(zhuǎn)化Json異常- Date JSON parse error

    解決日期轉(zhuǎn)化Json異常- Date JSON parse error

    這篇文章主要介紹了解決日期轉(zhuǎn)化Json異常- Date JSON parse error問題。具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SpringMVC中的http Caching的具體使用

    SpringMVC中的http Caching的具體使用

    本文主要介紹了SpringMVC中的http Caching的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot?@InitBinder注解綁定請求參數(shù)的過程詳解

    SpringBoot?@InitBinder注解綁定請求參數(shù)的過程詳解

    這篇文章主要介紹了SpringBoot?@InitBinder注解綁定請求參數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • spring使用redis操作key-value的示例代碼

    spring使用redis操作key-value的示例代碼

    這篇文章主要介紹了spring使用redis操作key-value的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 一文詳解Java二分查找算法

    一文詳解Java二分查找算法

    二分查找(binary search),也稱折半搜索,是一種在有序數(shù)組中查找某一特定元素的搜索算法,接下來就來給大家講講都有哪些查找算法,以及經(jīng)典的二分查找法該如何實(shí)現(xiàn),需要的朋友可以參考下
    2023-07-07
  • mybatis使用pagehelper插件過程詳解

    mybatis使用pagehelper插件過程詳解

    這篇文章主要介紹了mybatis使用pagehelper插件過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java的枚舉,注解和反射(二)

    Java的枚舉,注解和反射(二)

    今天小編就為大家分享一篇關(guān)于Java枚舉,注解與反射原理說明,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-07-07
  • springboot編程式事務(wù)TransactionTemplate的使用說明

    springboot編程式事務(wù)TransactionTemplate的使用說明

    這篇文章主要介紹了springboot編程式事務(wù)TransactionTemplate的使用說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

高邑县| 宜兴市| 西藏| 东丽区| 马公市| 乐山市| 渝北区| 东乌| 承德县| 峨眉山市| 广州市| 建昌县| 隆回县| 青海省| 舒城县| 平远县| 华池县| 光泽县| 云梦县| 贺州市| 泸定县| 萨迦县| 黎平县| 师宗县| 桑日县| 会理县| 大关县| 望城县| 刚察县| 腾冲县| 巫溪县| 神农架林区| 宝丰县| 万年县| 东阳市| 湖州市| 包头市| 舟曲县| 重庆市| 平度市| 疏附县|