【发布时间】:2016-04-01 01:42:20
【问题描述】:
我们使用 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();
}
}
所以我认为我们可以很容易地用LongAdder 替换_total,但是因为我们做了_current.addAndGet(delta),所以对于LongAdder 来说效果不佳,我们也不能对`_max' 值进行cas 操作.
有没有什么好的算法可以基于LongAdder 或类似的可扩展无锁结构来收集此类统计信息?
实际上,当我问到时,我们的统计数据通常会更新 6 到 10 个 AtomicLong。如果我们仍然看到争用,是否只获取一个锁并更新 6 到 10 个正常的 long 会更好吗?
【问题讨论】:
标签: java concurrency statistics java-8 java.util.concurrent