DoubleAdder源码解析
DoubleAdder类介绍
AtomicLong类通过CAS提供了非阻塞的原子性操作,相比使用synchronized来说,性能已经有了很大的提升。但是,在高并发的场景下,大量线程同时使用AtomicLong时,只能有一个线程能成功,其他线程只能通过自旋获取新的值,再后续更新自己的值。这期间就浪费了大量的CPU资源。
JDK8新增了一个原子性递增或者递减类DoubleAdder用来克服在高并发下使用AtomicLong的缺点。
类图
主要属性
无
主要方法
DoubleAdder()
1 | /** |
创建一个新的DoubleAdder对象并初始化为0
add(double)
1 | /** |
如果cells数组不为空,并且cas(base,base+x)失败,设置竞态条件为true。
如果cells数组为null,或者长度为0,又或者当前线程对应的cell数组位置上cell值为null。再或者cas(base,base+x)再失败,就调用父类的striped64的doubleAccumulate方法。
sum()
1 | /** |
返回base和当前所有cell上的值的和
reset()
1 | /** |
base设置为0,然后每个非空的cell上的值设置为0.
sumThenReset()
1 | /** |
返回当前的和,并重置
toString()
1 | /** |
返回当前和的字符串形式
doubleValue()
1 | /** |
返回当前和
longValue()
1 | /** |
返回当前和并转为long型。注意参数溢出,这是一个向下转型。
intValue()
1 | /** |
返回当前和并转为int型。注意参数溢出,这是一个向下转型。
floatValue()
1 | /** |
返回当前和并转为float型,注意参数溢出,这是一个向下转型。