首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LongAdder计算统计计数器的最大值?

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

Stack Overflow用户
提问于 2016-04-01 01:42:20
回答 1查看 515关注 0票数 5

我们使用AtomicLongs收集一些统计数据。一些用户看到了这方面的争论,建议改用LongAdder。然而,我认为无法像我们目前在原子上所做的那样计算最大值:

代码语言:javascript
复制
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的值执行can操作。

是否有任何好的算法来收集基于LongAdder或类似的可伸缩的无锁结构的统计数据?

实际上,当我问的时候,我们的统计数据通常更新6到10 AtomicLongs。如果我们看到了争用,它是否可能是更好的抓取一个锁,并更新6至10个正常的多头?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 02:34:14

您不需要LongAdder,但是LongAccumulator在这里:您需要new LongAccumulator(Math::max, Long.MIN_VALUE),它在这里做的是正确的事情。LongAdderLongAccumulator的特例。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36346670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档