我们使用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),这在这里做对了。 LongAdderLongAccumulator的特例。

关于java - 使用LongAdder计算统计计数器的最大值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36346670/

10-09 03:49