gre*_*egw 5 java statistics concurrency java.util.concurrent java-8
我们使用AtomicLongs收集一些统计信息。一些用户看到了关于这些的争执,并建议改用LongAdder。但是,正如我们目前使用Atomic所做的那样,我认为无法计算最大值:
AtomicLong _current, _total, _max;
...
void add(long delta)
{
long current = _current.addAndGet(delta);
if (delta>0)
{
_total.addAndGet(delta);
long max = _max.get();
while (current > max)
{
if (_max.compareAndSet(max, current))
break;
max = _max.get();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我认为我们可以_total
很容易地用替换掉LongAdder
,但是因为这样做_current.addAndGet(delta)
对a LongAdder
来说效果不好,也不能对_max值进行cas操作。
是否有任何好的算法可以基于LongAdder
或类似的可伸缩无锁构造收集此类统计信息?
实际上,尽管我要询问,但我们的统计信息通常会更新6至10个AtomicLongs。如果无论如何我们都在争论,那么仅仅抓住一个锁并更新6到10个正常的长仓可能会更好吗?
你不想要LongAdder
,但是LongAccumulator
在这里:你想要new LongAccumulator(Math::max, Long.MIN_VALUE)
,这在这里做正确的事情。 LongAdder
是 的一个特例LongAccumulator
。
归档时间: |
|
查看次数: |
332 次 |
最近记录: |