我们使用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个AtomicLongs.如果我们无论如何都看到争用,那么抓住一个锁并更新6到10个正常长度可能会更好吗?