首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.util.concurrent.atomic.LongAdder类的可行性

java.util.concurrent.atomic.LongAdder类的可行性
EN

Stack Overflow用户
提问于 2020-12-18 07:26:47
回答 1查看 184关注 0票数 1

LongAdder是一个精心设计的原子计数器,在更新共享计数器时应该减少缓存线争用。问题是,它依赖原子CAS操作来实际更新计数(这是它与更通用的LongAccumulator和朋友共享的特性)。

在amd64平台上(可能在其他地方),原子CAS比原子添加慢得多,至少当涉及到适量的核时是如此。因此,似乎简单地对单个共享VarHandle执行原子添加是一个更好的主意:代码更简单,而在普通(大约8核)容器上性能并不差甚至更好。

LongAdder介导的原子添加相比,使用VarHandle是否有任何好处?

关于更多的上下文:

默认情况下,

  1. 将所有原子操作(甚至简单的算术)作为
  2. 循环执行(例如:https://github.com/openjdk/jdk/blob/64644a10725abb4bea8a947508999be6c67c52ed/src/java.base/share/classes/jdk/internal/misc/Unsafe.java#L2468)。如果觉得做so.
  3. LongAdder,是一个切分的CAS循环,那么JIT可以自由地升级到更好的东西,绝对比任何简单的CAS循环都要快,即使在低争用级别也是如此。然而,对于任何争用级别,
  4. 看起来都比AMD64上的实际硬件原子添加(“锁定XADD”指令)要慢一些。通过大量增加碎片的数量(至少2倍的CPU计数,在大的乘法器上可以实现额外的增益,如8x和beyond).
  5. Still,),就可以更快更快地将适当的原子计数器(执行硬件添加而不是CAS)的切分操作变得更快和更简单。
EN

回答 1

Stack Overflow用户

发布于 2020-12-19 01:40:42

LongAdder的设计是为了在与AtomicLong相反的编写大量脚本的情况下更好地扩展,在任何级别的争用中都是如此,但没有,而且确实是这样。

如果您的场景不太注重编写,那么AtomicLong就会更快。

C2编译器总是用硬编码的程序集代替@HotSpotIntrinsicCandidate-annotated方法,而不仅仅是在它想这样做的时候。

lock xadd比CAS重试循环增加值的速度更快。LongAdderlock xadd更快,因为它在线程之间拆分计数器。它会创建多个计数器,从而减少争用。

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

https://stackoverflow.com/questions/65353188

复制
相关文章

相似问题

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