安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

阿里三面JavaLongAccumulator原子累加器源码

12月8日 夜未央投稿
  原文链接:https:juejin。cnpost7090464618052583455
  基于JDK1。8详细介绍了JUC下面的LongAccumulator原子类源码和原理,LongAccumulator是Java8对于原子类的增强。1LongAccumulator的原理1。1LongAccumulator的概述
  publicclassLongAccumulatorextendsNumberimplementsSerializable
  LongAccumulator同样是来自于JDK1。8的atomic包,和LongAdder都继承了Striped64,但是LongAccumulator比LongAdder的功能更强大。
  LongAccumulator相比于LongAdder,可以为累加器提供非0的初始值,后者只能提供默认的0值。另外,前者还可以指定累加规则,比如不进行累加而进行相乘,只需要在构造LongAccumulator时传入自定义的双目运算器即可,后者则只能是累加规则。
  我们在此前学习了LongAdder的源码:JavaLongAdder原子累加器源码深度解析,现在我们来学习LongAccumulator的源码。它们的远啊吗和兴部分都是一样的,因此建议先学习LongAdder的源码。1。2LongAccumulator的原理1。2。1内部结构
  LongAccumulator内部具有两个自己的属性,一个LongBinaryOperator类型的双目运算器实例,用于保存累加规则。一个identity用于保存指定的初始值,也是base的初始值,在reset等重置方法调用的时候也会赋值为base的值。
  只有一个构造器,可以传递指定的累加规则和指定初始值。内部的LongBinaryOperator类型的属性,用于保存传入的双目运算器LongBinaryOperator是一个函数式接口,就是对累加规则的封装privatefinalLongBinaryOidentity用于保存的初始值,也是base的初始值,在reset等重置方法调用的时候也会赋值为base的值使用给定的累加器和初始值创建新实例。paramaccumulatorFunction一个双目运算器实例,可以对两个long类型的值进行计算如果为null那么在计算时将会抛出NullPointerExceptionparamidentity初始值publicLongAccumulator(LongBinaryOperatoraccumulatorFunction,longidentity){为function赋值this。functionaccumulatorF为base和identity赋值basethis。}复制代码1。2。2accumulate更新给定值
  publicvoidaccumulate(longx)
  具有给定值的更新。作为LongAccumulator的核心方法!
  accumulate方法类似于LongAdder的add方法,区别在于可以使用构造器中指定的累加器中的累加规则更新数据。
  这里的LongBinaryOperator是一个JDK1。8添加的函数式接口,主要是为了lambda的调用,这个接口封装了对两个long类型参数的操作规则,通过调用applyAsLong方法对传入的参数进行操作并返回操作的结果。更新方法,与LongAdder的add方法差别在于:1。调用casBase时LongAdder传递的是bx,LongAccumulator则使用了rfunction。applyAsLong(bbase,x)自定义的规则来计算。2。调用longAccumulate时第二个参数LongAdder传递的是null,LongAccumulator传递了function累加器publicvoidaccumulate(longx){Striped64。Cell〔〕longb,v,r;Striped64。Cif((ascells)!null差别1:base要被更新为通过运算器对base和x计算出来的结果,这里也能知道传递的function不能为null(rfunction。applyAsLong(bbase,x))!b!casBase(b,r)){if(asnull(mas。length1)0(aas〔getProbe()m〕)null!(uncontended(rfunction。applyAsLong(va。value,x))va。cas(v,r)))差别2:第二个参数传递的function累加器,而不是null在longAccumulate方法中,在CAS更新value或者base的时候,会判断function是否为null,即:a。cas(va。value,((fnnull)?vx:fn。applyAsLong(v,x)))casBase(vbase,((fnnull)?vx:fn。applyAsLong(v,x)))如果不为null,那么使用制定累加器规则更新longAccumulate(x,function,uncontended);}}复制代码1。3其他操作
  publiclongget()
  返回当前值。类似于LongAdder的sum方法,只不过由加法变成了指定的累加规则。
  publiclonglongValue()
  内部调用get()方法。
  publicvoidreset()
  重置维持更新到标识值的变量。类似于LongAdder的reset方法,只不过base值由0变成了在构造器中传递的identity。2LongAccumulator的案例
  一个指定(ab2)的累加规则的案例如下:传递一个累加器LongBinaryOperator实例LongAccumulatorlongAccumulatornewLongAccumulator(newLongBinaryOperator(){OverridepubliclongapplyAsLong(longleft,longright){指定的累加规则leftright2这里的left对应LongAccumulator中的base或者某个Cell的value,这的right对应accumulate传递的参数xreturnleftright2;}初始值为2},2);更新2longAccumulator。accumulate(6);获取结果,应该是6System。out。println(longAccumulator。get());复制代码3LongAccumulator的总结
  LongAccumulator的功能更加强大,可以指定初始值和累加规则,这样看起来LongAdder更像是LongAccumulator的特例,即初始值为0,累加规则为加法。
  因此如果想要使用longAccumulator实现LongAdder的功能,那么我们手动将累加规则指定为加法,并且identity指定为0即可:LongAccumulatorlongAccumulatornewLongAccumulator(newLongBinaryOperator(){OverridepubliclongapplyAsLong(longleft,longright){返回leftright,这样累加规则就和LongAdder一样了}初始值为0},0);更新6longAccumulator。accumulate(6);更新1longAccumulator。accumulate(1);获取结果,应该是7System。out。println(longAccumulator。get());复制代码
  可以看到我们初始化LongAccumulator对象的代码量还是比较多的,特别是创建匿名对象的代码。上面我们说过这个LongBinaryOperator是一个函数式接口,因此我们推荐使用lambda表达式的写法:LongAccumulatorlongAccumulatornewLongAccumulator((left,right){},0);复制代码
  更进一步,我们可以使用方法引用:LongAccumulatorlongAccumulatornewLongAccumulator(Long::sum,0);复制代码
  它们的含义都是一样的,即采用加法运算,但是代码量却简单了许多,所以lambda还是很有必要学习的!
  相关文章:Unsafe:JUCUnsafe类的原理详解与使用案例。volatile:Java中的volatile实现原理深度解析以及应用。CAS:Java中的CAS实现原理深度解析与应用案例。伪共享:Java中的伪共享深度解析以及避免方法。JMH:Java使用JMH进行方法性能优化测试。
投诉 评论 转载

亚马逊编年史了解首富贝索斯听樊登读书《亚马逊编年史》去了解一个企业了解一个人!亚马逊的AWS(云服务)作为一个独立业务,在2005年开始起步。贝索斯的前瞻性,以为阿里云挺牛,但是思路原来源自于亚马……第八篇新能源汽车为什么车上都去造电池注:2021年广汽集团、吉利集团、德国大众、特斯拉纷纷宣布投资芯片生产线,那为什么这些企业不跟芯片厂家合作了,却要自己生产呢?一:【车企造电池猜测】1:减少成本目前……现在手机拍照这么好,是否还有购买相机的必要?是很不错。知足者长乐。如果想再提升有创意性的高画质也可购一款单反不过全看个人的兴趣而定。现在手机拍照这么好,是否还有购买相机的必要?那得看你干什么用!手机拍照……我有一百万,能投资阿里巴巴吗?谢谢邀请!你有一百万当然能够投资阿里巴巴。不过我还是觉得这个问题问的挺二的,如果想炫富,我觉得你也应该问我有一亿,能投资阿里巴巴吗?毕竟王健林的小目标都是一个亿。如……AI要有心了在电影宇宙里人工智能发展到达了一个又一个巅峰智械危机、天网、终结者影响甚至控制人类生活现实生活中人工智能便利着我们的生活但是距离影视作品中……斯柯达的品牌历史和有故事的明锐近期有媒体报道称斯柯达已经解散在华营销团队,后续研发团队也将解散,这一消息引起了网络热议。其实斯柯达是一个有情感有历史有情怀的百年汽车品牌。而且小星作为汽车电子工程师身份与斯柯……苹果appstore应用商店限免应用(4月27日)可省60元白嫖指南:如何获得视频中软件:用手机扫码下载所需要的app在appstore输入软件名称查找什么是限时免费的软件限时免费是开发者将软件的价格临时调……阿里三面JavaLongAccumulator原子累加器源码原文链接:https:juejin。cnpost7090464618052583455基于JDK1。8详细介绍了JUC下面的LongAccumulator原子类源码和原理……groupby详解一。概述groupby的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。二。语法select字段from表名where条件groupby字……python包之Pillow图像处理教程一、安装被认为是python官方图像处理库PIL非常适合于图像归档以及图像的批处理任务。可以使用PIL创建缩略图,转换图像格式,打印图像等等PIL支持众多的GUI框架接口,可以……聊聊软件开发的SLAP原则序本文主要研究一下软件开发的SLAP(SingleLevelofAbstractionPrinciple)原则SLAPSALP即SingleLevelofAbstr……微信聊天新功能!微信免打扰检测好友删除教程微信聊天新功能据微信官方反馈称,微信APP又上线了一款新功能,当在跟好友聊天时发照片,右上角多了一个搜索图标。点搜索后,我们的照片会自动分类,我们可以在里面搜索照片……
浅谈新能源汽车8月程序员工资数据出炉!Java的工资居然这么高可实现自我繁殖!全球首个活体机器人诞生鄂尔多斯的比特币矿机是怎样运转的?泳池筹款派对加密货币和迷你特朗普PeterThiel离开Fa华为发布首款鸿蒙打印机PixLabX1,零门槛颠覆打印机市场华为新笔记本电脑将发布或可运行安卓App真没钱了!手机出货量连续4年下跌,居民开始存钱了阿里巴巴打造最好的团队,必须用好这4种员工加码自动驾驶,传收购深动科技,雷军的大整合开始了?随手拍对比真我GTNeo3iPhoneSE3OPPOFind购买电视竟然要靠抢,TCLX11也太火了吧

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利