当前位置:   article > 正文

AtomicLong 到 LongAdder_longadder atomiclong

longadder atomiclong

一、为什么会出现LongAdder?

用来克服在高并发下使用AtomicLong的缺点;

1.1 AtomicLong在高并发下的缺点是什么?

AtomicLong 要管理的值是成员变量value;

通过代码可以看到AtomicLong 对数据value的更新主要通过unsafe 的compareAndSwapLong 和getAndAddLong 来操作

  1. public final long getAndSetLong(Object var1, long var2, long var4) {
  2. long var6;
  3. do {
  4. var6 = this.getLongVolatile(var1, var2);
  5. } while(!this.compareAndSwapLong(var1, var2, var6, var4));
  6. return var6;
  7. }

可以看到unsafe里对getAndAddLong 进行了循环操作,表现就是线程在更新失败时,会进入自旋,直到更新成功。

不管是unsafe 的循环 还是外部程序的循环 让线程自旋的做法,在高并发下使用AtomicLong时,大量线程会同时去竞争同一个原子变量,但是由于同一时间只有一个线程的cas操作会成功,这就造成大量线程在竞争失败后,会通过无限循环不断进行自旋尝试cas操作,而这会白白浪费cpu资源。(这也是为什么使用cas 乐观锁尽量在并发低,线程竞争不激烈时使用的原因

1.2 LongAdder 是怎么避免高并发下这个问题的?

1.2.1 先来看看LongAdder 内部的数据结构

LongAdder 继承Striped64 类;LongAdder自己没有成员变量,他的值都是由Striped64来管理的,他其实就是一个外壳。

1.2.2 Striped64类里有四个成员变量

  • 机器cpu 数,判断是否要扩容cell数组的时候使用,cell数组长度最大为cpu数

static final int NCPU = Runtime.getRuntime().availableProcessors();

  • cell 数组,初始化长度为2

transient volatile Cell[] cells;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/363122
推荐阅读
相关标签
  

闽ICP备14008679号