使用LongAdder计算统计计数器的最大值?

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个正常的长仓可能会更好吗?

Lou*_*man 5

你不想要LongAdder,但是LongAccumulator在这里:你想要new LongAccumulator(Math::max, Long.MIN_VALUE),这在这里做正确的事情。 LongAdder是 的一个特例LongAccumulator