Java LongAdder sumThenReset并发

时间:2016-02-04 14:31:18

标签: java concurrency

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

sumThenReset 的文档说明如下:

  

返回的值不保证是重置前的最终值

那我们在这做了什么?是否意味着某些增量可能会丢失并且不会计入任何地方?

2 个答案:

答案 0 :(得分:1)

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

long sum = longAdder.sum();<br>
longAdder.add(-sum);<br>
return sum;

它非常好用。 原因是因为场景背后的实现将存储分解为多个单元。因此,实际原子添加的数量显着减少。因此它针对原子添加进行了优化。 sum,reset和sumAndReset迭代单元格并求和或重置或两者都是原子的。因此,使用负添加效果非常好。因为你完全删除了你总结的东西,并且只返回那么多,因此保持了所有的数量。

答案 1 :(得分:0)

阅读整个方法doc:

  

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

静止意味着完全。也就是说,没有线程正在更新LongAdder。所以要回答你的问题,是的,一些增量可能会丢失。

来自课程文档:

  

当多个线程时,此类通常优于AtomicLong   更新用于收集等目的的公用金额   统计,而不是细粒度的同步控制。

您可能需要的是AtomicLong。

相关问题