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

Java并發(fā)編程-volatile可見性詳解

 更新時間:2019年03月22日 11:30:42   作者:尋箏  
這篇文章主要介紹了Java并發(fā)編程-volatile可見性詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

要學(xué)習(xí)好Java的多線程,就一定得對volatile關(guān)鍵字的作用機(jī)制了熟于胸。最近博主看了大量關(guān)于volatile的相關(guān)博客,對其有了一點(diǎn)初步的理解和認(rèn)識,下面通過自己的話敘述整理一遍。

有什么用?

volatile主要對所修飾的變量提供兩個功能

可見性
防止指令重排序
<br>本篇博客主要對volatile可見性進(jìn)行探討,以后發(fā)表關(guān)于指令重排序的博文。

什么是可見性?

把JAVA內(nèi)存模型(JMM)展示得很詳細(xì)了,簡單概括一下

1.每個Thread有一個屬于自己的工作內(nèi)存(可以理解為每個廚師有一個屬于自己的鐵鍋)
2.所有Thread共用一個主內(nèi)存(餐廳所有的廚師共用同一個冰箱)
3.每個Thread操作數(shù)據(jù)之前都會去主內(nèi)存中獲取數(shù)據(jù)(廚師炒菜之前都要去冰箱里拿食材)

  1. Thread:廚師
  2. 工作內(nèi)存:鐵鍋
  3. store&load:放熟食,取食材
  4. 主內(nèi)存:冰箱

讀者可思考以下情景:<br> 餐廳來了一位顧客點(diǎn)了一份紅燒肉,此時有兩位大廚(假設(shè)大廚之間互不通信),由于互不通信,所以兩位大廚都打開冰箱取出食材開始炒菜。 最后炒出了兩份紅燒肉,顧客只要一份。為什么會造成這種結(jié)果?

由于大廚之間沒有可見性。

將此情景放在JAVA中即是:<br> 線程A從主內(nèi)存中取了一個變量到工作內(nèi)存中,操作完畢后沒有及時放回主內(nèi)存中,于是線程B去取這個變量已經(jīng)過期了,取的是線程A操作之前的變量。

如何擁有可見性?

先介紹一下Java內(nèi)存模型中定義的8種工作內(nèi)存與主內(nèi)存之間的原子操作

  1. lock( 鎖定 ):作用于主內(nèi)存的變量,把一個變量標(biāo)識為一條線程獨(dú)占的狀態(tài)。
  2. unlock(解鎖):作用于主內(nèi)存的變量,把一個處于鎖定的變量釋放出來,釋放變量才可以被其他線程鎖定。
  3. read(讀?。鹤饔糜谥鲀?nèi)存的變量,把一個變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的load動作使用。
  4. load(載入):作用于***工作內(nèi)存***的變量,它把read操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中。
  5. use(使用):作用于***工作內(nèi)***存種的變量,它把工作內(nèi)存中一個變量的值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個需要使用到變量的值的字節(jié)碼指令時將會執(zhí)行這個操作。
  6. assign(賦值):作用于***工作內(nèi)存***中的變量,它把一個從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個給變量賦值的字節(jié)碼指令時執(zhí)行這個操作。
  7. store(存儲):作用于***工作內(nèi)存***的變量,它把工作內(nèi)存中一個變量的值傳送到主內(nèi)存中,以便隨后的write操作使用
  8. write(寫入):作用于主內(nèi)存的變量,它把store操作從工作內(nèi)存中得到的值放入主內(nèi)存的變量中。

讀取賦值一個普通變量的情況

發(fā)起read操作到write操作套流程的時間里,線程2隨時都有可能對這個主內(nèi)存對象發(fā)起第二套操作

有什么危害呢?
假設(shè)主內(nèi)存中有一個

int a=0;

線程1和線程2分別執(zhí)行一次,理想狀態(tài)下最終a的值為2.

a++;

線程1在執(zhí)行了assign操作之后變量a的真實值已經(jīng)從0變成了1,但是這個過程發(fā)生在工作內(nèi)存中對其他線程不可見,若線程2此時對變量a的操作,讀取到的值仍然為0,因為沒有可見性,線程2的操作也僅僅是重復(fù)了線程1的操作,再次讓a從0變成了1。并沒有達(dá)到期望的a=2。

讀取賦值一個volatile變量的情況

操作更嚴(yán)格:

use之前不能被read&load
assign之后必須緊跟store&write
也就是說 read-load-use 和 assign-store-write成為了兩個不可分割的原子操作

盡管這時候在use和assign之間依然有一段真空期,有可能變量會被其他線程讀取,但是無論在哪一個時間點(diǎn)主內(nèi)存的變量和任一工作內(nèi)存的變量的值都是相等的。這個特性就導(dǎo)致了volatile變量不適合參與到依賴當(dāng)前值的運(yùn)算,如自增。 那么依靠可見性的特點(diǎn)volatile可以用在哪些地方呢? 《Java虛擬機(jī)》提到:

運(yùn)算結(jié)果并不依賴變量的當(dāng)前值(即結(jié)果對產(chǎn)生中間結(jié)果不依賴),或者能夠確保只有單一的線程修改變量的值
通常volatile用做保存某個狀態(tài)的boolean值。

以上所述是小編給大家介紹的Java并發(fā)編程-volatile可見性詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • java的各種類型轉(zhuǎn)換全部匯總(推薦)

    java的各種類型轉(zhuǎn)換全部匯總(推薦)

    下面小編就為大家?guī)硪黄猨ava的各種類型轉(zhuǎn)換全部匯總(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 詳談Java中的二進(jìn)制及基本的位運(yùn)算

    詳談Java中的二進(jìn)制及基本的位運(yùn)算

    下面小編就為大家?guī)硪黄斦凧ava中的二進(jìn)制及基本的位運(yùn)算。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • mybatis多表查詢的實現(xiàn)(xml方式)

    mybatis多表查詢的實現(xiàn)(xml方式)

    本文主要介紹了mybatis多表查詢的實現(xiàn)(xml方式),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java設(shè)計模式中的迭代器模式詳解

    Java設(shè)計模式中的迭代器模式詳解

    迭代器模式官方解釋就是提供一個對象來順序訪問聚合對象中的一系列數(shù)據(jù),而不暴露聚合對象的內(nèi)部表示。何為聚合對象呢?最典型的就是集合類。大白話也就是,集合中的數(shù)據(jù)是私有的,集合中不應(yīng)該提供直接遍歷的方法,要定義一個新的對象用于訪問這個集合
    2023-02-02
  • @OneToMany查詢陷入循環(huán)引用的解決方案

    @OneToMany查詢陷入循環(huán)引用的解決方案

    這篇文章主要介紹了@OneToMany查詢陷入循環(huán)引用的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java多線程模擬交通燈管理系統(tǒng)

    java多線程模擬交通燈管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java多線程模擬交通燈管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java中l(wèi)ist根據(jù)id獲取對象的幾種方式

    Java中l(wèi)ist根據(jù)id獲取對象的幾種方式

    這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist根據(jù)id獲取對象的幾種方式,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java(TM) Platform SE binary 打開jar文件的操作

    Java(TM) Platform SE binary 打開jar文件的操作

    這篇文章主要介紹了Java(TM) Platform SE binary 打開jar文件的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java并發(fā)工具之CountDownLatch使用詳解

    Java并發(fā)工具之CountDownLatch使用詳解

    這篇文章主要介紹了Java并發(fā)工具之CountDownLatch使用詳解,通過使用 CountDownLatch可以使當(dāng)前線程阻塞,等待其他線程完成給定任務(wù),可以類比旅游團(tuán)導(dǎo)游要等待所有的游客到齊后才能去下一個景點(diǎn),需要的朋友可以參考下
    2023-12-12
  • springboot快速整合Mybatis組件的方法(推薦)

    springboot快速整合Mybatis組件的方法(推薦)

    Spring Boot是由Pivotal團(tuán)隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了springboot快速整合Mybatis組件的方法,需要的朋友可以參考下
    2019-11-11

最新評論

江口县| 芦溪县| 深泽县| 东乡| 泊头市| 东丰县| 重庆市| 杭锦旗| 唐海县| 长治市| 青州市| 安丘市| 衡山县| 普陀区| 齐齐哈尔市| 石河子市| 西青区| 平果县| 金门县| 罗田县| 英吉沙县| 湘潭市| 慈溪市| 西宁市| 喜德县| 巢湖市| 永善县| 北安市| 凤山县| 连山| 锦屏县| 仙居县| 富平县| 宝清县| 蓝田县| 比如县| 甘孜| 桐庐县| 崇州市| 桃园县| 柏乡县|