我们使用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();
}
}
因此,我认为我们可以用
_total
轻松地替换LongAdder
,但是因为我们执行的_current.addAndGet(delta)
不适用于LongAdder
,所以也不能对_max值进行cas操作。是否有任何好的算法可以基于
LongAdder
或类似的可伸缩无锁构造收集此类统计信息?实际上,尽管我要询问,但我们的统计信息通常会更新6至10个AtomicLongs。如果无论如何我们都在争论,那么仅仅捕获一个锁并更新6到10个正常的长仓可能会更好吗?
最佳答案
您不需要LongAdder
,但这里需要LongAccumulator
:您需要new LongAccumulator(Math::max, Long.MIN_VALUE)
,这在这里做对了。 LongAdder
是LongAccumulator
的特例。
关于java - 使用LongAdder计算统计计数器的最大值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36346670/