我正在考虑转而使用AtomicLong的LongAdder。我用它来计算到达服务器的请求,每1分钟我将结果写入数据库并重新开始计数。为此,我使用了AtomicLong的 getAndSet 方法,我打算用LongAdder的 sumThenReset 替换它。
sumThenReset 的文档说明如下:
返回的值不保证是重置前的最终值
那我们在这做了什么?是否意味着某些增量可能会丢失并且不会计入任何地方?
答案 0 :(得分:1)
我发现如果你将sumAndReset的实现扩展为:
long sum = longAdder.sum();<br>
longAdder.add(-sum);<br>
return sum;
它非常好用。 原因是因为场景背后的实现将存储分解为多个单元。因此,实际原子添加的数量显着减少。因此它针对原子添加进行了优化。 sum,reset和sumAndReset迭代单元格并求和或重置或两者都是原子的。因此,使用负添加效果非常好。因为你完全删除了你总结的东西,并且只返回那么多,因此保持了所有的数量。
答案 1 :(得分:0)
阅读整个方法doc:
此方法可能适用于例如静止点之间 多线程计算。如果有与此同时发生的更新 方法,返回值不保证是最终值 在重置之前发生。
静止意味着完全。也就是说,没有线程正在更新LongAdder。所以要回答你的问题,是的,一些增量可能会丢失。
来自课程文档:
当多个线程时,此类通常优于AtomicLong 更新用于收集等目的的公用金额 统计,而不是细粒度的同步控制。
您可能需要的是AtomicLong。