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

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

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

瀏覽:21日期: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久久,三上悠亚国产精品一区二区三区
亚洲精品极品少妇16p| 精品中文在线| 久久99青青| 日韩亚洲精品在线观看| 首页欧美精品中文字幕| 午夜av一区| 国产精品亚洲一区二区三区在线观看| 欧美激情91| 欧美一级全黄| 国产丝袜一区| 亚洲精品欧美| 亚洲一级大片| 亚洲日本免费电影| 日韩中文字幕视频网| 亚洲精品日本| 午夜性色一区二区三区免费视频| 亚洲日本在线观看视频| 亚洲精品九九| 日韩精品亚洲专区| 日韩av不卡在线观看| 日韩和欧美一区二区三区| 伊人久久亚洲| 综合激情网...| 日韩欧美2区| 国产探花在线精品| 色婷婷色综合| а√天堂8资源中文在线| 国产一区日韩| 五月激情久久| 日韩亚洲精品在线| 麻豆亚洲精品| 少妇精品久久久一区二区| 日韩亚洲精品在线观看| 久久狠狠久久| 国产精品v一区二区三区| 另类欧美日韩国产在线| 国产va免费精品观看精品视频| 福利一区视频| 在线一区视频观看| 黑丝一区二区三区| 中文字幕视频精品一区二区三区| 蜜桃视频免费观看一区| 日本免费新一区视频| 国产精品男女| 伊人久久av| 亚洲经典在线| 国产亚洲精品美女久久| 岛国av在线播放| 女同性一区二区三区人了人一| 亚洲香蕉视频| 免费在线亚洲| 久久人人99| 综合一区在线| 精品国产黄a∨片高清在线| 亚洲精品.com| 免费人成精品欧美精品| 色8久久久久| 国产精品99一区二区三| 好吊一区二区三区| 国产亚洲人成a在线v网站| 欧产日产国产精品视频| 丝袜美腿亚洲一区二区图片| 国产精品欧美在线观看| 亚洲福利免费| 国产欧美69| 欧洲亚洲一区二区三区| 亚洲香蕉久久| 日韩中文字幕在线一区| 日韩av自拍| 在线一区二区三区视频| 久久亚州av| 欧美日韩中文字幕一区二区三区| 日本不卡视频在线| 欧美日韩尤物久久| 91成人在线网站| 久久高清免费| 青草国产精品| 欧美a级一区| 国产精品视频一区二区三区四蜜臂| 日韩国产专区| 国产精品自拍区| 亚洲国内精品| 国产精品白浆| 久久国产精品99国产| 国语精品一区| 亚洲影院天堂中文av色| 久久精品亚洲一区二区| 老司机精品久久| 国产资源在线观看入口av| 天堂va在线高清一区| 久久久人人人| 麻豆视频久久| 亚洲精品九九| 久久亚洲国产| 精品五月天堂| 婷婷成人av| 久久久影院免费| 国产福利资源一区| 一区二区国产在线观看| 999久久久91| 精品国产午夜| 亚洲午夜免费| 不卡在线一区| 国产夫妻在线| 国产精品一线| 蜜桃久久av一区| 亚洲欧美综合| 色婷婷亚洲mv天堂mv在影片| 日本h片久久| 久久国产高清| 激情欧美丁香| 高潮一区二区| 精品亚洲成人| 国产精品高潮呻吟久久久久| 亚洲欧美一级| 日韩精品国产精品| 激情视频一区二区三区| 国产精品伦理久久久久久| 日韩二区在线观看| 亚洲影视一区二区三区| 中文在线不卡| 天堂网在线观看国产精品| 波多野结衣久久精品| 国产精久久久| 国产精品尤物| 欧美永久精品| 日韩一二三区在线观看| 性色av一区二区怡红| 91久久中文| 五月综合激情| 欧美不卡高清| 日韩电影免费网站| 在线手机中文字幕| 天堂√中文最新版在线| 91日韩在线| 久久久久久网| 色网在线免费观看| 精品日韩视频| 麻豆精品蜜桃| 久久激情网站| 99tv成人| 午夜视频精品| 亚洲欧美日韩国产| 在线看片一区| 日韩一区精品| 日本欧美大码aⅴ在线播放| 丝袜a∨在线一区二区三区不卡| 日韩亚洲在线| 日韩精品一级中文字幕精品视频免费观看| 国产精品婷婷| 在线 亚洲欧美在线综合一区| 好看的av在线不卡观看| 麻豆亚洲精品| 日韩午夜视频在线| 国产日韩一区二区三区在线播放| 日韩av网站在线观看| 久久精品99久久久| 蜜桃久久久久| 日韩大片在线观看| 欧美日韩激情| 亚洲精品系列| 日韩精品久久久久久| 国产日产一区| 精品国产欧美日韩| 91看片一区| 亚洲欧美高清| 日本视频一区二区| 国产精品.xx视频.xxtv| 国产精品国产一区| 欧美精品资源| 亚洲永久字幕| 日韩av不卡一区二区| 精品视频网站| 久久蜜桃av| 中文字幕成人| 国产精品一区三区在线观看| 精品国产aⅴ| 国产中文一区| 日韩国产精品久久久久久亚洲| 国产欧美69| 亚洲一级少妇| 一区二区电影在线观看| 精品网站aaa| 婷婷成人基地| 欧美日韩夜夜| 成人日韩在线| 中文精品电影| 国产一区二区三区黄网站| 国产专区一区| 青草av.久久免费一区| 成人久久一区| 亚洲精品99| 日韩欧美高清一区二区三区| 欧美国产中文高清| 欧美一级精品| 久久中文视频| 日韩不卡免费视频| 久久中文精品| 宅男噜噜噜66国产日韩在线观看| 中文字幕一区二区av|