40.原子累加器

本文讨论了Java8引入的LongAccumulator类在计数性能上的提升,尤其强调了其通过减少CAS重试和利用懒惰初始化、多个累加单元来优化竞争状态,以及使用@sun.misc.Contended注解防止缓存行伪共享,以确保数据一致性
摘要由CSDN通过智能技术生成

java8之后,新增了专门用于计数的类,LongAccumulator,LongAdder的性能高于AtomicLong。

LongAdder 性能 > AtomicLong 性能

性能高的原因:如果都往一个共享变量上面进行累加,那么比较重试的次数肯定就多;如果分成几个变量分别进行累加就优化了。在竞争时设置了多个累加单元。Thread-0累加Cell[0],而Thread-1累加Cell[1]....最后将结果汇总。这样它们在累加时操作不同的Cell变量,因此减少了CAS重试失败,从而提高性能。

cells 累加单元数组,懒惰初始化

base 基础值,如果没有竞争,则用cas累加这个阈

在cells 创建或者扩容时,置为1,表示加锁。

Cell类的源码:

@sun.misc.Contended注解,防止缓存行伪共享

缓存的加入会造成数据副本的产生,即同一份数据会缓存在不同核心的缓存行中。

CPU要保证数据的一致性,如果某个CPU核心更改了数据,其他CPU核心对应的整个缓存行必须失效。

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷土重来…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值