首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java LongAdder sumThenReset并发

Java LongAdder sumThenReset并发
EN

Stack Overflow用户
提问于 2016-02-04 14:31:18
回答 2查看 531关注 0票数 1

我正在考虑从AtomicLong切换到使用AtomicLong。我使用它来计算到达服务器的请求,每隔1分钟我就将结果写入DB并重新开始计数。为此,我使用了AtomicLong的getAndSet方法,我打算用sumThenReset of LongAdder替换它。

sumThenReset的文档说明如下:

返回的值不一定是重置前的最终值。

我们在这里做了什么?这是否意味着,根据定义,某些增量可能会丢失,在任何地方都不会被计算在内?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-04 14:58:05

阅读整个方法吧,医生:

例如,这种方法可以适用于多线程计算之间的静止点。如果与此方法并发更新,则不能保证返回的值是重置之前发生的最终值。

安静意味着安静。也就是说,没有线程正在更新LongAdder。因此,要回答你的问题,是的,有些增量可能会丢失。

来自班级的医生:

当多个线程更新一个用于收集统计信息,而不是用于细粒度同步控制的公共和时,这个类通常比AtomicLong更好。

您可能需要的是AtomicLong。

票数 0
EN

Stack Overflow用户

发布于 2018-01-22 15:14:55

我发现,如果将sumAndReset的实现扩展为:

代码语言:javascript
复制
long sum = longAdder.sum();<br>
longAdder.add(-sum);<br>
return sum;

效果很好。原因是场景背后的实现将存储分解为多个单元格。因此,实际原子添加的数量明显减少。因此,它对原子添加进行了优化。和、重置和sumAndReset迭代单元格和和或重置,或者两者都是原子的。因此,相反,使用负添加非常好。因为您准确地删除了所加的内容,并且只返回了如此多的值,从而维护了over all计数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35203699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档