赞
踩
用来克服在高并发下使用AtomicLong的缺点;
AtomicLong 要管理的值是成员变量value;
通过代码可以看到AtomicLong 对数据value的更新主要通过unsafe 的compareAndSwapLong 和getAndAddLong 来操作
- public final long getAndSetLong(Object var1, long var2, long var4) {
- long var6;
- do {
- var6 = this.getLongVolatile(var1, var2);
- } while(!this.compareAndSwapLong(var1, var2, var6, var4));
-
- return var6;
- }
可以看到unsafe里对getAndAddLong 进行了循环操作,表现就是线程在更新失败时,会进入自旋,直到更新成功。
不管是unsafe 的循环 还是外部程序的循环 让线程自旋的做法,在高并发下使用AtomicLong时,大量线程会同时去竞争同一个原子变量,但是由于同一时间只有一个线程的cas操作会成功,这就造成大量线程在竞争失败后,会通过无限循环不断进行自旋尝试cas操作,而这会白白浪费cpu资源。(这也是为什么使用cas 乐观锁尽量在并发低,线程竞争不激烈时使用的原因)
LongAdder 继承Striped64 类;LongAdder自己没有成员变量,他的值都是由Striped64来管理的,他其实就是一个外壳。
机器cpu 数,判断是否要扩容cell数组的时候使用,cell数组长度最大为cpu数
static final int NCPU = Runtime.getRuntime().availableProcessors();
cell 数组,初始化长度为2
transient volatile Cell[] cells;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。