Java SDK 并发包里提供了丰富的原子类,我们可以将其分为五个类别,这五个类别提供的方法基本上是相似的,并且每个类别都有若干原子类。
对基本数据类型的变量值进行原子更新;对对象变量的指向进行原子更新;对数组里面的的元素进行原子更新;原子化的对象属性更新器;原子化的累加器。基本数据类型AtomicBoolean、AtomicLong、AtomicInteger 这三个类提供了一些对基本数据类型的变量值进行原子更新的方法。
(相关资料图)
这些类提供的方法是相似的,主要有(以 AtomicLong 为例):
// 原子化的 i++long getAndIncrement()// 原子化的 i--long getAndDecrement()// 原子化的 ++ilong incrementAndGet()// 原子化的 --ilong decrementAndGet()// 原子化的 i+=delta,返回值为+=前的i值long getAndAdd(long delta)// 原子化的 i+=delta,返回值为+=后的i值long addAndGet(delta)// CAS操作。如果写回成功返回true,否则返回falseboolean compareAndSet(long expect, long update)// 以下四个方法新值可以通过传入函数式接口(func函数)来计算long getAndUpdate(LongUnaryOperator updateFunction)long updateAndGet(LongUnaryOperator updateFunction)long getAndAccumulate(long x, LongBinaryOperator accumulatorFunction)long accumulateAndGet(long x, LongBinaryOperator accumulatorFunction)
// 演示 getAndUpdate() 方法的使用public static void main(String[] args) { AtomicLong atomicLong = new AtomicLong(0); long result = atomicLong.getAndUpdate(new LongUnaryOperator() { @Override public long applyAsLong(long operand) { return operand + 1; } });}
对象引用类型AtomicReference、AtomicStampedReference、AtomicMarkableReference 这三个类提供了一些对对象变量的指向进行原子更新的方法。如果需要对对象的属性进行原子更像,那么可以使用原子化的对象属性更新器。
public class ClassName { AtomicReference employeeAR = new AtomicReference<>(new Employee("小明")); public void methodName() { Employee oldVal = employeeAR.get(); Employee newVal = new Employee(oldVal.getName()); employeeAR.compareAndSet(oldVal, newVal); }}
对象引用的原子化更新需要重点关注 ABA 问题。当一个线程在进行 CAS 操作时,另一个线程可能会在此期间修改了同一个共享变量的值,然后又将其改回原来的值。这种情况下,CAS 操作就无法检测到共享变量值的变化,从而导致 ABA 问题。如果我们仅仅在写回数据前判断数值是 A,可能导致不合理的写回操作。AtomicStampedReference 和 AtomicMarkableReference 这两个原子类可以解决 ABA 问题。
AtomicStampedReference 通过为对象引用建立类似版本号(stamp)的方式,来解决 ABA 问题。AtomicStampedReference 实现的 CAS 方法增加了版本号参数AtomicMarkableReference 的实现机制则更简单,将版本号简化成了一个 Boolean 值boolean compareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp)boolean compareAndSet(V expectedReference, V newReference, boolean expectedMark, boolean newMark)
数组AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray 这三个类提供了一些对数组里面的的元素进行原子更新的方法。
public class ClassName { AtomicLongArray atomicLongArray = new AtomicLongArray(new long[]{0, 1}); public void methodName() { int index = 0; long oldVal = atomicLongArray.get(index); long newVal = oldVal + 1; atomicLongArray.compareAndSet(index, oldVal, newVal); }}
原子化的对象属性更新器原子化的对象属性更新器有:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater。
这三个类提供了一些对对象的属性进行原子更新的方法。这些方法是利用反射机制实现的。
public class ClassName { AtomicIntegerFieldUpdater fieldUpdater = AtomicIntegerFieldUpdater.newUpdater(Employee.class, "salary"); Employee employee = new Employee("小明", 1000); public void methodName() { int oldVal = employee.getSalary(); int newVal = oldVal + 1000; fieldUpdater.compareAndSet(employee, oldVal, newVal); }}
需要注意的是:
对象属性的类型必须是基本数据类型,不能是基本数据类型对应的包装类。如果对象属性的类型不是基本数据类型,newUpdater() 方法会抛出 IllegalArgumentException 运行时异常。对象的属性必须是 volatile 类型的,只有这样才能保证可见性。如果对象的属性不是 volatile 类型的,newUpdater() 方法会抛出 IllegalArgumentException 运行时异常。// AtomicIntegerFieldUpdater 类中的代码if (field.getType() != int.class) { throw new IllegalArgumentException("Must be integer type");}if (!Modifier.isVolatile(modifiers)) { throw new IllegalArgumentException("Must be volatile type");}
原子化的累加器原子化的累加器有:LongAdder、DoubleAdder、LongAccumulator、DoubleAccumulator。这四个类仅仅用来在多线程环境下,执行累加操作。
相比原子化的基本数据类型,原子化的累加器的速度更快,但是它(原子化的累加器)不支持 compareAndSet() 方法。如果仅仅需要累加操作,使用原子化的累加器性能会更好。
原子化的累加器的本质是空间换时间。
LongAdder 的使用示例如下所示:
public static void main(String[] args) { LongAdder adder = new LongAdder(); // 初始化 adder.add(1); // 累加 for (int i = 0; i < 100; i++) { adder.increment(); } long sum = adder.sum();}
LongAccumulator 与 LongAdder 类似,但 LongAccumulator 提供了更加灵活的累加操作,可以自定义累加函数。
使用示例如下所示。在使用示例中,我们创建了一个 LongAccumulator 对象,初始值为1,累加函数为 (x, y) -> x * y,即每次累加都将之前的结果与新的值相乘。然后,我们累加了三个数值,最后输出累加结果。由于累加函数是(x, y) -> x * y,所以最终的累加结果为1 * 5 * 10 * 20 = 1000。
public static void main(String[] args) { LongAccumulator accumulator = new LongAccumulator(new LongBinaryOperator() { @Override public long applyAsLong(long left, long right) { return left * right; } }, 1); // 初始值为1,累加函数为(x, y) -> x * y accumulator.accumulate(5); accumulator.accumulate(10); accumulator.accumulate(20); // 累加结果为 1 * 5 * 10 * 20 = 1000 long result = accumulator.get();}
参考资料21 | 原子类:无锁工具类的典范 (geekbang.org)
标签:
上一篇 : 女儿墙高度一般为多少上人(女儿墙高度一般为多少)
下一篇 : 最后一页
最新推荐
JavaSDK并发包里提供了丰富的原子类,我们可以将其分为五个类别,这五个类别提供的方法基本上是相似的,并
相信大家对女儿墙高度一般为多少上人,女儿墙高度一般为多少的问题都很疑惑,这个问题很多人还不知道怎么解
“武汉一小学生校内被教师驾车撞伤致死”细节披露肇事教师称:曾挥手让学生离开车前5月25日,武汉市汉阳...
今天(5月26日),中国船舶大连造船自主设计的全球第一艘M350型浮式生产储卸油船正式交付。该船型是世界首个
土耳其新里拉兑换人民币最新汇率(2023年5月26日)
中信证券指出,轨道交通系统作为国家交通运输网络的重要组成部分,近年来持续吸收人工智能、大数据等技术进
刚刚,广州再现摇号地块!白云嘉禾望岗东北侧AB2108014地块,经18轮竞价达最高限价,进入封顶摇号环节。地
序逛展今年的AWE,我们不难发现今年展品的科技感明显增强了,AI这个关键词在不同的家电品类间,不同的品牌
前不久举办的华表奖颁奖典礼堪称众星云集,不过除了盛装出席的明星们外,还有一位星二代也引发网友关注。5
悦也是一款充满矛盾的车型:论颜值没有对手,毕竟将硬派方盒子造型落地纯电动小型车的企业,有且仅有宝骏一
24小时财经资讯平台,依托新锐财经日报《每日经济新闻》(NationalBusinessDaily),打造中国最具影响力的经
5月25日,奥泰生物(688606)融资买入475 78万元,融资偿还180 88万元,融资净买入294 9万元,融资余额1 04亿元。
近日,第18届、第19届中国电影华表奖已经落下了帷幕,张译、任素汐分别获得了第18届优秀男、女演员,刘烨和
每经AI快讯,在A股市场结构性行情持续演绎、人工智能板块投资火热的背景下,人工智能细分领域的投资机会逐
欢迎观看本篇文章,小升来为大家解答以上问题。艺术设计主要学什么,艺术设计主要学习的范围很多人还不知道
周四(5月25日)纽约尾盘,ICE美元指数涨0 31%,报104 207点,日内交投区间为103 839-104 312点,逼近3月17日顶部104 445。
来为大家解答以下的问题,31608是什么标准,s31608这个很多人还不知道,现在让我们一起来看看吧!1、S31608不
1、改格式。2、或者在PHOTOSHOP里面:图象--图象大小里面修改像素。本文到此分享完毕,希望对大家有所帮助。
1、匀速直线运动。2、受力必然平衡!有斜向上的静摩擦力。
大河网讯日前,以“食全食美漯在其中”为主题的第二十届中国(漯河)食品博览会在漯河国际会展中心举行...
25日下午4点25分左右,日本长野县中野市有人报警称“男子刀刺女性”,赶到现场的警察遭猎枪枪击。据该县...
南方财经5月25日电,今日,新希望服务(3658 HK)与成都市武侯区人民政府、成都人居商业管理有限公司、首程
乌克兰谷物协会(UGA):黑海粮食外运走廊协议谈判造成发货安排被推迟,这给乌克兰造成10亿美元(出口)损失
当看完一部影视作品后,相信大家的视野一定开拓了不少吧,是时候静下心来好好写写观后感了。好的观后感对于
想必现在有很多小伙伴对于把珍珠戴在脚上好吗方面的知识都比较想要了解,那么今天小好小编就为大家收集了一
1、18日晚,张文宏医生在一场直播中表示,中国疫情防控做得很好,人们都戴口罩的情况下传染新冠病毒的概率
距离6月1日大限,已正式迈入了倒计时一周的时间,6月初到期的多笔超短期美债收益率一举升破了7%关口,周三
丰立智能涨20%三个交易日机构净卖出6266万元---中国经济网北京5月25日讯丰立智能今日涨停,股价收报66 97元
七月火把节歌曲歌词,七月火把节歌曲歌词是什么很多人还不知道,现在让我们一起来看看吧!1、《七月火把节
证券时报·e公司5月25日消息,比亚迪、长城汽车股价双双走低,比亚迪跌超1%,长城汽车跌超4%。
陕西省西咸新区泾河新城开发建设(集团)有限公司(简称“泾河集团”)发布2023年度境外债券承销服务项目成...
5月25日,以“数字化转型赋能高质量发展”为主题的第十七届中国信息港论坛暨首届数字化转型高峰论坛在青...
原LGD成员AME、Xinq、Faithbian近日在马尔代夫旅行,在照片上看到了三位选手和他们的女朋友。从马代回来后
吉祥航空(603885)在业绩说明会上表示,目前从公司整体机队的日利用率来看,已经恢复到10 4小时左右;分区域
日前,中国太保召开大健康战略行动发布会,正式对外发布“352”大健康服务蓝图,擘画“健康生活太保行动...
原标题:“创新成果超市”激发一线职工创新活力日前,康为世纪的职工邵振中通过“职工创新成果超市”微...
人生就是不断与其博弈的过程,同生活博弈,我们靠什么赢?知识与见识 01愚昧无知会让自己看不清真相,迷失
创新引领,开放共赢。2023中关村论坛展览(科博会)将于5月25日至30日在中关村国家自主创新示范区展示中心
5月24日2时12分,渔船“鲁蓬远渔028”沉没,位置位于南纬5度47 939分,东经77度46 315分,水深约5000米。截
截至2023年5月24日收盘,上海电力(600021)报收于10 7元,下跌2 19%,换手率2 36%,成交量61 88万手,成交额6 7
5月24日,威腾电气(688226)融资买入1137 84万元,融资偿还319 28万元,融资净买入818 56万元,融资余额45
据新华社华盛顿5月24日电美国佛罗里达州长德桑蒂斯24日向联邦选举委员会递交文书,参加竞选下一届美国总统
昆明信息港讯(昆明日报记者廖兴阳)5月24日,来自云南省发展和改革委员会的消息,滇东北、曲靖、滇南、滇
本报西安5月24日电(记者龚仕建)“太方便了,省时省力,再也不用两头跑了,省了上千公里路程,真是高效...
导读来为大家解答以上的问题。石头的外衣那部电视剧,石头的外衣这个很多人还不知道,现在让我们一起来看看
目前张翰新剧东八区的先生们遭质疑手放在王晓晨的胸部的关注度特别高,热度非常高,这也证明大家现在都在关
大家好,小万来为大家解答以上的问题。寻找生命的逻辑:生物学观念的发展,关于寻找生命的逻辑:生物学观念
大象新闻记者刘园园视频报道5月24日,厦门市公安局发布警情通报称:5月23日20时46分,厦门市公安局新店派出
1、《思南县国开发展基金资金使用管理办法》是思南县施行的办法。本文到此分享完毕,希望对大家有所帮助。
1、商品打折怎么计算解析:商品打折问题是小学六年级百分数的应用中的一个类型,这种题型中有三个数量:原
一张陌生人的图片“活化”成为视频? 深度合成正瓦解“眼见为实”
一张陌生人的图片“活化”成为视频? 深度合成正瓦解“眼见为实”
焦点短讯!我武生物:黄花蒿花粉变应原舌下滴剂扩展儿童适应症人群的药品补充申请获得批准
云南省财政厅企业会计信息网络报送系统管理员 云南省财政厅企业会计信息网络报送系统|每日速讯
桂发祥:针对糖尿病人和控糖人群,公司开发了糖醇类麻花和糖醇类糕点,以及抑制蔗糖吸收的益糖麻花
2023年全市结核病防治工作培训会暨肺结核患者关怀项目启动会在商州召开
外国的csgo开箱平台有哪些 csgo外国职业选手开箱平台推荐-热资讯
年轻人加入老年旅游团被调侃体力不行 老年人比年轻人的精力还要旺盛 每日热闻
美国驻华大使:期待在新任中国驻美大使谢锋履新后继续和他一起工作
矩阵股份:5月23日融资买入179.22万元,融资融券余额3004.95万元|全球热头条
世界微头条丨2023上海市高中学业水平合格考试息技术科目模拟练习系统上线
新股公告|易点云(02416)最终发售价为每股10.19港元 预计5月25日上市 天天信息
每日热讯!2023年一级建造师《法规知识》建设工程发承包法律制度思维导图_天天实时
4月快递行业数据点评:淡季价格小幅回落 看好件量增长与竞争格局改善
公司问答丨悦康药业:公司重点品种悦康通进入湖北中成药省际带量采购方案目录
多名乘客讲述乘坐国泰航空经历:空乘对白人殷勤,今天态度仍然很冷漠|微动态
全球观热点:备案均价约11.2万元/平米 深圳南山招商四海臻邸获批预售
每日速读!杭州玉渚园艺有限公司_关于杭州玉渚园艺有限公司概略
天天热消息:新冠药概念走势活跃,众生药业涨停,翰宇药业等大涨
Copyright © 2015-2022 南非律师网版权所有 备案号:沪ICP备2022005074号-13 联系邮箱:58 55 97 3@qq.com