上一篇栈管理器介绍了LongAdder的使用。表演太炸裂了。您还在使用AtomicInteger和AtomicLong吗?如果您还不知道LongAdder,请阅读我之前写的文章。上次说到,在JDK8+的atomic包下,还有一个兄弟类:LongAccumulator:这个类是什么鬼?本帖继续带大家揭开它的神秘面纱!LongAccumulatorLongAccumulator可以理解为LongAdder的增强版,比LongAdder更强大,或者LongAdder只是LongAccumulator的一个实现。另外,这些问题在Java程序员的面试过程中是一定要问的。出镜率极高,Java程序员必懂。我也在Java面试库小程序里面整理了这些题。欢迎来到小程序刷题。例如:LongAdder只能对数字进行简单的加减法(只能做1),而LongAccumulator提供了自定义的函数接口,可以按照规则进行累加,无论加减多少,乘减多少分,或者最大值,你想怎么取,规则由你决定。如源码所示:这个类也是JDK1.8新加入的。与LongAdder不同的是,它的构造函数提供了两个参数:LongBinaryOperator:函数式接口参数;恒等式:初值;LongBinaryOperator函数接口方法需要两个long值(左值+右值),最后返回一个long值。实战测试1.实现LongAdder首先,栈长使用LongAccumulator实现与LongAdder相同的功能。定义具有累加规则的LongAccumulator:privatestaticLongAccumulatorlongAccumulatorAdd=newLongAccumulator((left,right)->left+right,0);这里用到了lambda表达式,也是Java8引入的新语法,不懂的可以关注公众号:Java技术栈,看我之前写的Java8+系列教程,它们都组织在菜单栏中,所以我不会在这里介绍它们。使用LongAccumulator累加:/***@author:stacklength*@from:公众号Java技术栈*/privatestaticvoidadd(LongAccumulatorlongAccumulator,longnumber)throwsInterruptedException{longstart=System.currentTimeMillis();ExecutorServicees=Executors.newFixedThreadPool(MAX_POOL_SIZE);for(inti=0;i{for(intj=0;j{longAccumulator.accumulate(finalI*10);});}es.shutdown();es.awaitTermination(5,TimeUnit.MINUTES);System.out.printf("LongAccumulator最大结果:%s,耗时:%sms.\n",longAccumulator.get(),(System.currentTimeMillis()-start));longAccumulator.reset();}这里只贴出核心测试代码,完整代码已经上传到Github:https://github.com/javastacks...测试一下:/***@author:Stacklength*@from:公众号Java技术栈*/publicstaticvoidmain(String[]args)throwsInterruptedException{//与LongAdder一致add(longAccumulatorAdd,1);//每次累加2add(longAccumulatorAdd,2);//找到最大值max(longAccumulatorMax);}初始值为50,循环中的最大值应该是9*10=90,看测试结果:没问题,结果输出正常当然,这个类差远了用于查找最大值。这里只是这个自定义规则的一个演示。您可以计算产品,更复杂的判断操作和其他自定义规则操作。有了自定义规则,它能实现的功能远比LongAdder强大,性能上也是势均力敌。综上所述,LongAccumulator是有初值的,提供自定义规则的功能接口参数,比LongAdder功能强大。可以理解为LongAdder是LongAccumulator的一个实现,或者LongAccumulator是LongAdderVersion的增加。一句话总结就是:LongAdder可以做简单的自增自减1,LongAccumulator可以做复杂的累加操作。那么,如何解决count++的线程安全问题呢?还有其他选择吗?栈长最后总结:累加方式加synchronized/Lock同步锁; 使用AtomicInteger/AtomicLong原子类;使用LongAdder原子类(推荐);使用LongAccumulator原子类(推荐);本文实际源码完整版已经上传:https://github.com/javastacks...欢迎Star学习,公众号这里会提供所有Java实战范例!好了,今天的分享就到这里。稍后栈长会分享更多有趣的Java技术和最新的技术资料。关注公众号Java技术栈第一时间推送。我也会分享主流的Java面试题和参考答案。全部搞定后在公众号后台回复关键词“面试”刷题。最后,如果觉得我的文章对你有用,动动你的小手,送给正在看的人,转发吧,原创不易,楼主需要你的鼓励。版权声明:本文为公众号《Java技术栈》原创。转载、引用本文内容请注明出处。抄袭、洗稿均为侵权投诉,后果自负,并保留追究法律责任的权利。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!