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

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

Java原子變量類常見問題解決

瀏覽:3日期:2022-09-04 15:02:54

在學習多線程時,遇到了原子變量類,它是基于 CAS 和 volatile 實現的,能夠保障對共享變量進行 read-modify-write 更新操作的原子性和可見性。于是我就寫了一段代碼試試,自認為非常正確。

public class Test{ private static AtomicInteger ID = new AtomicInteger(0); public static int nextID(){ //返回的ID范圍為 1~100 if(ID.get() == 100) { //ID到達100時,則從1開始 ID.set(1); return ID.get(); // return ID = 1; } else return ID.incrementAndGet(); //++ID } public static void main(String[] args) throws Exception{ for(int i = 0; i < 5; i++){ new Thread(()->{for(int j = 0; j < 100; j++) nextID(); }).start(); } Thread.sleep(1000); //應該輸出100才對 System.out.println(ID); }}

用五個線程并發獲得ID,每個線程獲取100個,最后應該輸出100才是,但試了好幾次都不是100。原子變量類不是能保障原子性和可見性嗎,為什么出現了競態?

糾結了很久,還是很懵逼。后來發現 get 方法相當于讀取一個 volatile 變量,而讀取一個 volatile 變量時,不具備排他性!(AtomicInteger類內部使用了volatile修飾了value值,而volatile關鍵字不具備排他性)

也就是說,當一個線程剛讀取到了共享的 volatile 變量的值時,其他線程可會馬上對共享變量進行修改。如,線程A讀取到ID的值為99時(還沒對ID進行修改),其他線程可能馬上就將ID加1了,此時共享變量為100了,其他線程再獲取ID時,應該令ID=1才是,但線程A已經進入了else分支,它還認為ID=99,而不知道其他線程剛把ID加1變成了100,所以會吧ID加上1變成了101,這就出現了競態。

《Java多線程編程實戰指南 - 核心篇》中,作者說:“可見性的保障僅僅意味著一個線程能夠讀取到共享變量的相對新值,而不能保障該線程能讀取到相應變量的最新值”。如volatile對可見性的保障就是保障的相對新值,由于volatile不具備排他性,所以有可能讀線程剛讀到一個相對新值,寫線程就更改了共享變量,此時,讀線程剛剛讀取到的相對新值就不是最新的了。

作者對相對新值和最新值的定義:

對于同一個共享變量而言,一個線程更新了該變量的值之后,其他線程能夠讀取到這個更新后的值,那這個值就被稱為該變量的 相對新值。

如果讀取這個共享變量的線程在讀取并使用該變量的時候其他線程無法更新該變量的值,那么該線程讀取到的相對新值就被稱為該變量的 最新值。需要加鎖,才能讀取到最新值。

解決辦法,使用原子操作 compareAndSet:

private static int nextID(){ //返回的ID范圍為 1~100 ID.compareAndSet(100, 0); return ID.incrementAndGet();}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 棕刚玉_白刚玉_铝酸钙-锐石新材料 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | 浙江自考_浙江自学考试网| 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 广东教师资格网-广东教师资格证考试网| 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 九州网址_专注于提供网址大全分享推广中文网站导航服务 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | 微型气泵-真空-蠕动-水泵-厂家-深圳市品亚科技有限公司 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | 不锈钢水箱生产厂家_消防水箱生产厂家-河南联固供水设备有限公司 | 压力变送器-上海武锐自动化设备有限公司 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 运动木地板价格,篮球馆体育运动木地板生产厂家_欧氏地板 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 24位ADC|8位MCU-芯易德科技有限公司 | 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 河南膏药贴牌-膏药代加工-膏药oem厂家-洛阳今世康医药科技有限公司 | 高压贴片电容|贴片安规电容|三端滤波器|风华电容代理南京南山 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 传动滚筒,改向滚筒-淄博建凯机械科技有限公司 | 不锈钢监控杆_监控立杆厂家-廊坊耀星光电科技有限公司 | 香蕉筛|直线|等厚|弧形|振动筛|香蕉筛厂家-洛阳隆中重工 | 电机保护器-电动机综合保护器-浙江开民 | 信阳市建筑勘察设计研究院有限公司| 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 杭州厂房降温,车间降温设备,车间通风降温,厂房降温方案,杭州嘉友实业爽风品牌 | 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 流量检测仪-气密性检测装置-密封性试验仪-东莞市奥图自动化科技有限公司 | 超声波流量计_流量标准装置生产厂家 _河南盛天精密测控 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | 棕刚玉_白刚玉_铝酸钙-锐石新材料|