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

Java中保證多線程間的數(shù)據(jù)共享的方法詳解

 更新時間:2023年11月14日 11:54:23   作者:奔跑的毛球  
這篇文章詳解的發(fā)給大家介紹了Java中是如何保證多線程間的數(shù)據(jù)共享的,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

在討論這個問題之前,我們可以先瞅瞅Java的內(nèi)存模型JMM,JMM可不要和JVM混為一談。我們說的是內(nèi)存模型JMM(Java Memory Model)

Java的內(nèi)存模型

稍微解釋一下CPU的緩存,這里CPU的緩存有三級,L1,L2和L3。

  • L1是訪問速度最快的,是線程獨享。
  • L2次之,屬于內(nèi)核獨享。
  • L3是最慢的,是多核共享。

當(dāng)CPU執(zhí)行指令需要數(shù)據(jù)的時候,會先在L1,L2,L3中依次尋找,若是找不到,則會去JVM中尋找,而JMM則在CPU和主內(nèi)存之間來保證我們需要的可見性和有序性。

這個JMM就是Java內(nèi)存模型的核心,可見性有序性都是在這里實現(xiàn)。
而主內(nèi)存就是JVM,就是我們的堆內(nèi)存。

保證可見性的方式

可見性是指,當(dāng)多個線程操作同一個數(shù)據(jù)的時候,保證一個線程的修改對其他線程是可見的,也就是說不管多個線程如何操作,如何并發(fā),他們在同一時間取到的值是相同的。

為了保證可見性,我們一般有以下幾種方案:

volatile

可以用volatile來修飾基本數(shù)據(jù)類型,可以保證每次CPU操作數(shù)據(jù)的時候,都直接操作的是主內(nèi)存的值。

文末我們會說說volatile的原理

synchronized

對于synchronized來說,是誰拿到鎖,誰執(zhí)行操作,對于拿到鎖的線程來說,前邊線程的操作是可見的。

我會另起一篇文章專門講解synchronized。

lock

lock是基于CASvolatile的修改操作,可以保證操作數(shù)據(jù)時前邊操作的可見性。

final

final修飾的是常量啊,沒法寫,只讀,當(dāng)然是全局可見的

這里有一個小點:

我們清楚,volatile修飾基本數(shù)據(jù)類型的時候是可以保證可見性的,但是若是修飾的是引用數(shù)據(jù)類型呢?
一般沒人這么搞,甚至平時工作中volatile都很少使用,一不留神系統(tǒng)的性能會降低幾個維度。但是面試中常被問到,我們可以這樣回答:若volatile修飾的是引用數(shù)據(jù)類型,則只能保證引用數(shù)據(jù)類型的地址是可見的,里邊的值不可見。就這。

volatile的底層實現(xiàn)

稍微看看volatile的底層實現(xiàn)吧,其實

volatile的底層是匯編的lock指令,這個指令會強行要求將值寫入主內(nèi)存,并且忽略Store Buffer這種緩存,從而達到可見性的目的,同時利用MESI協(xié)議,讓其他緩存行失效。

我們曉得將java文件編譯為class文件的時候,會基于JIT做優(yōu)化,調(diào)整指令的順序,從而提升執(zhí)行效率,這個過程叫指令重排。
在CPU層面也會調(diào)整指令的順序來提升性能。而這個指令重排會導(dǎo)致一些問題,我們看看volatile是如何解決這個問題的。

原理

被volatile修飾的屬性,在編譯時會在先后增加內(nèi)存屏障。這里的提到的內(nèi)存屏障一般有四種

  • SS: StoreStore屏障前的讀寫操作必須全部完成,才會繼續(xù)屏障之后的操作
  • SL: StoreLoad屏障前的寫操作必須全部完成,才會繼續(xù)屏障之后的讀操作
  • LL: LoadLoad屏障前的讀操作必須全部完成,才能繼續(xù)屏障之后的讀操作
  • LS: LoadStore屏障前的讀操作必須全部完成,才能繼續(xù)屏障之后的寫操作

這里volatile的原理就如下

可以看到對于volatile的寫操作

之前添加了StoreStore內(nèi)存屏障,必須完成之前的讀寫操作才能繼續(xù)volatile的寫操作。
而后添加了StoreLoad屏障,要求其前邊的volatile寫操作完成,才能繼續(xù)之后的讀操作。

這樣就保證了在對volatile修飾的值執(zhí)行寫操作的時候,之前的讀寫操作已經(jīng)全部完成,而其后的讀操作在等待寫操作完成再去讀值。

而對于volatile的讀操作

在其后添加了一個LoadLoad屏障LoadStore屏障,這里這個LoadLoad屏障不是很理解,查閱了諸多資料也沒有眉目,若是有小伙伴知曉的,煩請不吝賜教。
LoadStore屏障則保證了volatile的讀操作全部完成之后,再繼續(xù)之后的寫操作。

這樣volatile的讀操作完成之后,才會執(zhí)行其他的寫操作。保證了讀到的值是確定的不變的。

以上就是Java中保證多線程間的數(shù)據(jù)共享的方法詳解的詳細內(nèi)容,更多關(guān)于Java多線程間的數(shù)據(jù)共享的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Docker 部署 SpringBoot 項目整合 Redis 鏡像做訪問計數(shù)示例代碼

    Docker 部署 SpringBoot 項目整合 Redis 鏡像做訪問計數(shù)示例代碼

    這篇文章主要介紹了Docker 部署 SpringBoot 項目整合 Redis 鏡像做訪問計數(shù)Demo,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Spring覆蓋容器中Bean的注解如何實現(xiàn)@OverrideBean

    Spring覆蓋容器中Bean的注解如何實現(xiàn)@OverrideBean

    文章介紹了在項目開發(fā)中如何通過偷梁換柱的方式重寫Spring容器中的內(nèi)置Bean,并指出了需要注意的兩點:1. 對應(yīng)的Bean應(yīng)基于接口注入;2. 如果不是基于接口注入,可以使用同包名同類名的方式重寫(可能存在潛在問題,不推薦),文章還強調(diào)了“基于接口編程”的好處
    2025-01-01
  • SpringBoot自動化配置綁定的項目實踐

    SpringBoot自動化配置綁定的項目實踐

    本文介紹了將遺留項目中的Properties硬編碼配置改造為SpringBoot的@ConfigurationProperties自動化配置的過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • 在IDEA中添加jar包到External Libraries庫的實現(xiàn)

    在IDEA中添加jar包到External Libraries庫的實現(xiàn)

    這篇文章主要介紹了在IDEA中添加jar包到External Libraries庫的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Ubuntu下配置Tomcat服務(wù)器以及設(shè)置自動啟動的方法

    Ubuntu下配置Tomcat服務(wù)器以及設(shè)置自動啟動的方法

    這篇文章主要介紹了Ubuntu下配置Tomcat服務(wù)器以及設(shè)置自動啟動的方法,適用于Java的web程序開發(fā),需要的朋友可以參考下
    2015-10-10
  • java 可重啟線程及線程池類的設(shè)計(詳解)

    java 可重啟線程及線程池類的設(shè)計(詳解)

    下面小編就為大家?guī)硪黄猨ava 可重啟線程及線程池類的設(shè)計(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 優(yōu)雅地在Java 8中處理異常的方法詳解

    優(yōu)雅地在Java 8中處理異常的方法詳解

    異常處理是我們在日常開發(fā)中經(jīng)常會遇到的一種需求,下面這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅地在Java 8中處理異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們來一起看看吧
    2019-01-01
  • 淺談java面向?qū)ο蟮臄?shù)組化信息處理

    淺談java面向?qū)ο蟮臄?shù)組化信息處理

    下面小編就為大家?guī)硪黄獪\談java面向?qū)ο蟮臄?shù)組化信息處理。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java使用apache?poi操作excel的方式

    Java使用apache?poi操作excel的方式

    這篇文章主要介紹了Java使用apache?poi進行excel相關(guān)操作,本文主要針對Apache?POI對excel的操作進行介紹,主要包括如何創(chuàng)建一個excel、錄入數(shù)據(jù)、讀取excel數(shù)據(jù)的方式,需要的朋友可以參考下
    2022-05-05
  • java文件刪除不了的坑,特別是壓縮文件問題

    java文件刪除不了的坑,特別是壓縮文件問題

    這篇文章主要介紹了java文件刪除不了的坑,特別是壓縮文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評論

长沙市| 涟水县| 永清县| 广西| 靖远县| 界首市| 桦南县| 大厂| 长阳| 富顺县| 荣成市| 比如县| 福海县| 茂名市| 宁晋县| 普宁市| 湘西| 郯城县| 贺州市| 甘孜县| 临夏县| 谢通门县| 沁阳市| 施秉县| 渝北区| 常德市| 益阳市| 邵武市| 酉阳| 炉霍县| 石城县| 正阳县| 鄂托克旗| 晴隆县| 弋阳县| 和平区| 达州市| 闵行区| 合阳县| 杨浦区| 深圳市|