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

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

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

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

Java的內(nèi)存模型

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

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

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

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

保證可見性的方式

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

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

volatile

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

文末我們會(huì)說說volatile的原理

synchronized

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

我會(huì)另起一篇文章專門講解synchronized。

lock

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

final

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

這里有一個(gè)小點(diǎn):

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

volatile的底層實(shí)現(xiàn)

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

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

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

原理

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

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

這里volatile的原理就如下

可以看到對(duì)于volatile的寫操作

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

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

而對(duì)于volatile的讀操作

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

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

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

相關(guān)文章

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

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

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

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

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

    SpringBoot自動(dòng)化配置綁定的項(xiàng)目實(shí)踐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

宽城| 孙吴县| 来凤县| 股票| 宣汉县| 宁明县| 拜泉县| 仁寿县| 石家庄市| 乌鲁木齐市| 镇江市| 博野县| 永州市| 沿河| 罗源县| 清涧县| 乌拉特前旗| 鄢陵县| 洛浦县| 明水县| 厦门市| 和顺县| 桃园县| 普宁市| 新野县| 海伦市| 潜山县| 灵山县| 合川市| 密云县| 军事| 临城县| 泰州市| 高邮市| 金川县| 大兴区| 瓮安县| 册亨县| 天峨县| 东明县| 二连浩特市|