我正在考虑从AtomicLong切换到使用AtomicLong。我使用它来计算到达服务器的请求,每隔1分钟我就将结果写入DB并重新开始计数。为此,我使用了AtomicLong的getAndSet方法,我打算用sumThenReset of LongAdder替换它。
sumThenReset的文档说明如下:
返回的值不一定是重置前的最终值。
我们在这里做了什么?这是否意味着,根据定义,某些增量可能会丢失,在任何地方都不会被计算在内?
发布于 2016-02-04 14:58:05
阅读整个方法吧,医生:
例如,这种方法可以适用于多线程计算之间的静止点。如果与此方法并发更新,则不能保证返回的值是重置之前发生的最终值。
安静意味着安静。也就是说,没有线程正在更新LongAdder。因此,要回答你的问题,是的,有些增量可能会丢失。
来自班级的医生:
当多个线程更新一个用于收集统计信息,而不是用于细粒度同步控制的公共和时,这个类通常比AtomicLong更好。
您可能需要的是AtomicLong。
发布于 2018-01-22 15:14:55
我发现,如果将sumAndReset的实现扩展为:
long sum = longAdder.sum();<br>
longAdder.add(-sum);<br>
return sum;效果很好。原因是场景背后的实现将存储分解为多个单元格。因此,实际原子添加的数量明显减少。因此,它对原子添加进行了优化。和、重置和sumAndReset迭代单元格和和或重置,或者两者都是原子的。因此,相反,使用负添加非常好。因为您准确地删除了所加的内容,并且只返回了如此多的值,从而维护了over all计数。
https://stackoverflow.com/questions/35203699
复制相似问题