一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Java并發編程-volatile可見性詳解

Java并發編程-volatile可見性詳解

2021-07-25 15:38尋箏 Java教程

這篇文章主要介紹了Java并發編程-volatile可見性詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

要學習好java的多線程,就一定得對volatile關鍵字的作用機制了熟于胸。最近博主看了大量關于volatile的相關博客,對其有了一點初步的理解和認識,下面通過自己的話敘述整理一遍。

有什么用?

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

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

什么是可見性?

Java并發編程-volatile可見性詳解

把java內存模型(jmm)展示得很詳細了,簡單概括一下

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

  1. thread:廚師
  2. 工作內存:鐵鍋
  3. store&load:放熟食,取食材
  4. 主內存:冰箱

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

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

將此情景放在java中即是:<br> 線程a從主內存中取了一個變量到工作內存中,操作完畢后沒有及時放回主內存中,于是線程b去取這個變量已經過期了,取的是線程a操作之前的變量。

如何擁有可見性?

先介紹一下java內存模型中定義的8種工作內存與主內存之間的原子操作

  1. lock( 鎖定 ):作用于主內存的變量,把一個變量標識為一條線程獨占的狀態。
  2. unlock(解鎖):作用于主內存的變量,把一個處于鎖定的變量釋放出來,釋放變量才可以被其他線程鎖定。
  3. read(讀取):作用于主內存的變量,把一個變量的值從主內存傳輸到線程的工作內存中,以便隨后的load動作使用。
  4. load(載入):作用于***工作內存***的變量,它把read操作從主內存中得到的變量值放入工作內存的變量副本中。
  5. use(使用):作用于***工作內***存種的變量,它把工作內存中一個變量的值傳遞給執行引擎,每當虛擬機遇到一個需要使用到變量的值的字節碼指令時將會執行這個操作。
  6. assign(賦值):作用于***工作內存***中的變量,它把一個從執行引擎接收到的值賦給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。
  7. store(存儲):作用于***工作內存***的變量,它把工作內存中一個變量的值傳送到主內存中,以便隨后的write操作使用
  8. write(寫入):作用于主內存的變量,它把store操作從工作內存中得到的值放入主內存的變量中。

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

Java并發編程-volatile可見性詳解

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

有什么危害呢?
假設主內存中有一個

?
1
int a=0;

線程1和線程2分別執行一次,理想狀態下最終a的值為2.

?
1
a++;

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

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

Java并發編程-volatile可見性詳解

操作更嚴格:

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

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

運算結果并不依賴變量的當前值(即結果對產生中間結果不依賴),或者能夠確保只有單一的線程修改變量的值
通常volatile用做保存某個狀態的boolean值。

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

原文鏈接:https://my.oschina.net/keepwent/blog/1814387

延伸 · 閱讀

精彩推薦
  • Java教程java公眾平臺通用接口工具類HttpConnectUtil實例代碼

    java公眾平臺通用接口工具類HttpConnectUtil實例代碼

    下面小編就為大家分享一篇java公眾平臺通用接口工具類HttpConnectUtil實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    guishengbin9012021-03-15
  • Java教程學習spring事務與消息隊列

    學習spring事務與消息隊列

    這篇文章主要為大家詳細介紹了spring事務與消息隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    登頂3662020-06-22
  • Java教程詳解springBoot啟動時找不到或無法加載主類解決辦法

    詳解springBoot啟動時找不到或無法加載主類解決辦法

    這篇文章主要介紹了詳解springBoot啟動時找不到或無法加載主類解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價...

    DE.Marcia12112020-09-16
  • Java教程java微信公眾號企業付款開發

    java微信公眾號企業付款開發

    這篇文章主要為大家詳細介紹了java微信公眾號企業付款開發,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    shaomiaojava7132021-06-02
  • Java教程Java抽獎算法第二例

    Java抽獎算法第二例

    這篇文章主要為大家詳細介紹了Java抽獎算法,根據概率將獎品劃分區間,每個區間代表一個獎品,然后抽取隨機數,具有一定的參考價值,感興趣的小伙伴...

    go2shell7652020-06-02
  • Java教程解析本地方法映射Java層的數據類型

    解析本地方法映射Java層的數據類型

    這篇文章給大家介紹了本地方法映射Java層的數據類型,包括基礎類型映射,引用類型映射等等,對java層數據類型映射相關知識,感興趣的朋友跟隨腳本之...

    github6482021-04-13
  • Java教程Java中的字符編碼問題處理心得總結

    Java中的字符編碼問題處理心得總結

    Java中的String類默認是Unicode編碼,大家平常所說的UTF-8就是使用最廣的一種unicode的實現方式,以下我們還是來看一下Java中的字符編碼問題處理心得總結: ...

    阿諾1992020-05-21
  • Java教程JAVA時間日期處理類實例

    JAVA時間日期處理類實例

    這篇文章主要介紹了JAVA時間日期處理類,可實現遍歷兩個日期之間的每一天的功能,涉及針對日期的常見操作技巧,需要的朋友可以參考下 ...

    MagicYK3272019-12-16
主站蜘蛛池模板: 嫩草视频在线观看免费 | 国产伦码精品一区二区三区 | 性色生活片在线观看 | 亚洲 日韩 在线 国产 视频 | 极品主播的慰在线播放 | 国产亚洲精品福利在线 | 亚洲 日韩 国产 制服 在线 | 国产精品乱码高清在线观看 | 美琪美腿白丝交小说 | ipx-177绝对领域在线观看 | 性导航h| 全彩调教侵犯h本子全彩妖气he | 国产卡一卡二卡四卡无卡 | 色综合天天娱乐综合网 | 亚洲午夜精品久久久久久成年 | xxnx日本免费护士 | 亚洲男人的天堂网 | 99国内精品久久久久久久黑人 | mmkk在线看片 | 91tm视频 | 欧美撒尿屁股嘘嘘撒尿 | 国产麻豆在线观看网站 | 国产人人艹 | 韩国帅男同gay网站 韩国三级在线播放 | pregnant欧美孕交xxx | 亚洲国产欧美在线看片 | 狠狠撸在线影院 | 精品久久成人免费第三区 | 日本不卡一区二区三区在线观看 | 国产精品igao视频网网址 | bbbbbbaaaaaa毛片 | 欧美一级h | 母乳在线播放 | 黄色大片免费网站 | 国产在线综合网 | 亚洲色图二区 | 天天操婷婷 | 狠狠综合网 | 国产一区二区免费福利片 | 亚洲AV久久无码精品九九软件 | 99re这里只有精品视频在线观看 |