电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:2日期: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
相關文章:
主站蜘蛛池模板: 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 | 铝合金电阻-无源谐波滤波器-上海稳达电讯设备厂 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 聚氨酯复合板保温板厂家_廊坊华宇创新科技有限公司 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 100_150_200_250_300_350_400公斤压力空气压缩机-舰艇航天配套厂家 | 市政路灯_厂家-淄博信达电力科技有限公司| 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 包装机传感器-搅拌站传感器-山东称重传感器厂家-济南泰钦电气 | 广东佛电电器有限公司|防雷开关|故障电弧断路器|智能量测断路器 广东西屋电气有限公司-广东西屋电气有限公司 | 北京京云律师事务所| 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 标策网-专注公司商业知识服务、助力企业发展| 贵州成人高考网_贵州成考网| 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 | 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 分轨 | 上传文件,即刻分离人声和伴奏 | SRRC认证|CCC认证|CTA申请_IMEI|MAC地址注册-英利检测 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 湖北省煤炭供应链综合服务平台 |