日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳細分析java并發之volatile關鍵字

瀏覽:23日期:2022-08-30 13:59:33

Java面試中經常會涉及關于volatile的問題。本文梳理下volatile關鍵知識點。

volatile字意為“易失性”,在Java中用做修飾對象變量。它不是Java特有,在C,C++,C#等編程語言也存在,只是在其它編程語言中使用有所差異,但總體語義一致。比如使用volatile 能阻止編譯器對變量的讀寫優化。簡單說,如果一個變量被修飾為volatile,相當于告訴系統說我容易變化,編譯器你不要隨便優化(重排序,緩存)我。

Happens-before

規范上,Java內存模型遵行happens-before。

volatile變量在多線程中,寫線程和讀線程具有happens-before關系。也就是寫值的線程要在讀取線程之前,并且讀線程能完全看見寫線程的相關變量。

happens-before:如果兩個有兩個動作AB,A發生在B之前,那么A的順序應該在B前面并且A的操作對B完全可見。

happens-before 具有傳遞性,如果A發生在B之前,而B發生在C之前,那么A發生在C之前。

如何保證可見性

多線程環境下counter變量的更新過程。線程1先從主存拷貝副本到CPU緩存,然后CPU執行counter=7,修改完后寫入CPU緩存,等待時機同步到主存。在線程1同步主存前,線程2讀到counter值依然為0。此時已經發生內存一致性錯誤(對于相同的共享數據,多線程讀到視圖不一致)。因為線程2看不見線程1操作結果,也將這個問題稱為可見性問題。

public class SharedObject { public int counter = 0;}

因為多了緩存優化導致,導致可見性問題。所以volatile通過消除緩存(描述可能不太準確)來避免。例如當使用volatile修飾變量后,操作該變量讀寫直接與主存交互,跳過緩存層,保證其它讀線程每次獲取的都是最新值。

public volatile int counter = 0;

詳細分析java并發之volatile關鍵字

volatile 不單只消除修飾的變量的緩存。事實上與之相關的變量在讀寫時也會消除緩存,如同使用了volatile一樣。

如下 years,months,days 三個變量中只有days是volatile,但是對years,months讀寫操作也和days時也會跳過緩存,其它線程每次讀到的都是最新值。

public class MyClass { private int years; private int months private volatile int days; public int totalDays() { int total = this.days; total += months * 30; total += years * 365; return total; } public void update(int years, int months, int days){ this.years = years; this.months = months; this.days = days; }}

這是為什么?我們分析一下。

一個寫線程調用 update,讀線程調用totalDays。單線程中,對于update方法,wa與wb存在happens-before關系, wa在 wb 之前執行并對wb可見。

多線程中rc與wb存在happens-before關系,wb在rc之前執行并對rc可見。根據 happens-before傳遞性,wa需要在rc前先執行并對rc可見。

因為wb是volatile變量,所以rc獲取的years,months也是最新值。

詳細分析java并發之volatile關鍵字

我們知道出于性能原因,JVM和CPU會對程序中的指令進行重新排序。如果update方法里面wa和wb順序被重排,那它們的happens-before關系將不在成立。

詳細分析java并發之volatile關鍵字

為了避免這個問題,volatile對重排序做了保證 對于發生在volatile變量操作前的其他變量的操作不能重新排序。

由此我們得到volatile通過消除緩存和防止重排保證線程的可見性。

volatile保證線程安全?

討論線程安全,大家都會提及原子性,順序性,可見性。volatile側重于保證可見性,也就是當寫的線程更新后,讀線程總能獲得最新值。在只有一個線程寫,多個線程讀的場景下,volatile能滿足線程安全。可如果多個線程同時寫入volatile變量時,則需要引入同步語義才能保證線程安全。

模擬10個線程同時寫入volatile變量,一個線程讀counter,執行完后正確結果應該是counter=10。

public static class WriterTask implements Runnable { private final ShareObject share; private final CountDownLatch countDownLatch; public WriterTask(ShareObject share, CountDownLatch countDownLatch) { this.share = share; this.countDownLatch = countDownLatch; } @Override public void run() { countDownLatch.countDown(); share.increase(); } } public class ShareObject { private volatile int counter; public void increase() { this.counter++; } }

執行結果出現counter=5或6 錯誤結果。

詳細分析java并發之volatile關鍵字

詳細分析java并發之volatile關鍵字

通過 synchronized,Lock或AtomicInteger 原子變量保證了結果的正確。

詳細分析java并發之volatile關鍵字

完整demo https://gist.github.com/onlythinking/ba7ca7aa5faf00a58f4cedae474fa6f6

volatile性能

volatile變量帶來可見性的保證,訪問volatile變量還防止了指令重排序。不過這一切是以犧牲優化(消除緩存,直接操作主存開銷增加)為代價,所以不應該濫用volatile,僅在確實需要增強變量可見性的時候使用。

總結

本文記錄了volatile變量通過消除緩存,防止指令重排序來保證線程可見性,并且在多線程寫入的變量的場景下,不保證線程安全。

歡迎大家留言交流,一起學習分享?。?!

以上就是詳細分析java并發之volatile關鍵字的詳細內容,更多關于JAVA volatile關鍵字的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美aⅴ一区二区三区视频| 不卡一二三区| 国产亚洲网站| 日韩欧美久久| 国内在线观看一区二区三区| 999国产精品999久久久久久| 一区福利视频| 日韩精品一卡| 蜜臀av亚洲一区中文字幕| 人人香蕉久久| 亚洲免费中文| 日本成人在线一区| 国产精品二区不卡| 91精品精品| 免费日韩一区二区| 国产精品99久久免费| 三上亚洲一区二区| 国产精品88久久久久久| 久久精品99国产精品日本| 精品国产精品久久一区免费式| 亚洲国产综合在线看不卡| 久久久久午夜电影| 欧美日韩91| 午夜在线观看免费一区| 欧美男人天堂| 中国字幕a在线看韩国电影| 日韩福利在线观看| 久久久精品五月天| 日韩高清在线一区| 国产精品多人| 国产高清日韩| 喷白浆一区二区| 日韩不卡在线| 久久久久久黄| 在线亚洲人成| 精品视频在线观看网站| 国产91久久精品一区二区| 日本中文字幕一区二区| 国产另类在线| 国产精品丝袜xxxxxxx| www.九色在线| 国产精品福利在线观看播放| 波多野结衣久久精品| 国产一区二区色噜噜| 亚洲成a人片| 日韩中文字幕麻豆| 国产福利亚洲| 欧美一区三区| 69精品国产久热在线观看| 国产精品一区亚洲| 青青久久av| 国产在线欧美| 日韩1区2区3区| 国产精品网在线观看| 日韩在线观看一区二区| 久久激情中文| 国产a亚洲精品| 欧美高清一区| 欧美中文日韩| 亚洲精品影视| 亚洲影视一区二区三区| 日韩黄色大片网站| 国产剧情一区二区在线观看| sm久久捆绑调教精品一区| 亚洲国产综合在线看不卡| 久久精品超碰| 国产精品magnet| 1024精品一区二区三区| 日韩avvvv在线播放| 亚洲最新无码中文字幕久久| 日韩高清欧美激情| 久色成人在线| 国产精品精品国产一区二区| 麻豆精品99| 国产一区日韩欧美| 日韩精品永久网址| 国产精品白丝一区二区三区| 在线成人直播| 欧美日韩精品在线一区| 精品中文字幕一区二区三区四区| 一区二区电影在线观看| 久久av日韩| 九九久久婷婷| 香蕉久久夜色精品国产| 日韩午夜在线| 99在线观看免费视频精品观看| 超碰成人av| 日韩精品视频网站| 欧美a一区二区| 精品美女在线视频| 日韩av有码| 在线观看亚洲精品福利片| 亚洲精品网址| 欧美91精品| 日韩精品视频中文字幕| 麻豆精品新av中文字幕| 免费久久久久久久久| 日韩国产一区二| 蜜桃成人av| 福利片在线一区二区| 在线看片不卡| 五月天久久久| 久久亚洲资源中文字| 久久一级电影| 精品一区二区三区的国产在线观看| 久久在线免费| 视频一区日韩精品| 亚洲一区二区三区久久久| 日韩一区网站| 欧美国产另类| 色8久久久久| 日韩国产一区二区三区| 国产色播av在线| 中文亚洲欧美| 日韩av字幕| 亚洲日本免费电影| 综合国产精品| 亚洲不卡av不卡一区二区| 免费污视频在线一区| 91精品啪在线观看国产18| 国产日韩在线观看视频| 久久国产精品久久久久久电车| 欧美不卡高清一区二区三区| 欧美一级鲁丝片| 久久精品国产免费| 免费成人网www| 秋霞国产精品| 精品国产欧美日韩一区二区三区| 香蕉久久久久久| а√天堂8资源在线| 日韩激情精品| 青草国产精品| 乱一区二区av| 激情不卡一区二区三区视频在线| 国产美女亚洲精品7777| 精品国产亚洲日本| 亚洲天堂黄色| 免费观看不卡av| 久久久久欧美精品| 蜜桃tv一区二区三区| 亚洲二区视频| 少妇高潮一区二区三区99| 美女少妇全过程你懂的久久| 婷婷精品在线| 你懂的国产精品永久在线| 91九色精品| 久久久五月天| 涩涩av在线| 国产精品嫩模av在线| 亚洲最大av| 国产一区二区精品福利地址| 日韩有吗在线观看| 国产精品女主播一区二区三区| 国产国产精品| 在线一区欧美| 免费精品视频| 7m精品国产导航在线| 欧美日韩视频免费看| 视频一区二区欧美| 精品亚洲a∨一区二区三区18| 久久理论电影| 亚洲久久视频| 成人羞羞视频在线看网址| 日韩欧美中文字幕在线视频| 老牛国产精品一区的观看方式| 四虎4545www国产精品| 日本精品久久| 久久精品一区二区国产| 日韩欧乱色一区二区三区在线| 亚洲高清av| 日韩一区自拍| 超碰超碰人人人人精品| 88久久精品| 日韩极品在线观看| 欧美日韩视频| 99国产成+人+综合+亚洲欧美| 国产一区福利| 欧美有码在线| 亚洲欧美网站在线观看| 日韩久久一区二区三区| 成人国产精品一区二区网站| 日本vs亚洲vs韩国一区三区二区| 伊人久久国产| 国产自产自拍视频在线观看| 国产精品一区二区精品视频观看 | 蜜桃tv一区二区三区| 亚洲香蕉久久| 亚洲天堂免费电影| 亚洲精品极品| 久久天堂av| 国产欧美二区| 日韩成人精品一区二区三区| 亚洲精品日本| 久久久影院免费| 日韩午夜电影| 日韩亚洲国产欧美| 欧美一区激情| 麻豆中文一区二区| 欧美精品aa| 精品视频网站|