LongAdder
2021-03-12 16:51:57 0 举报
图解LongAdder
作者其他创作
大纲/内容
longAccumulate
初始化cell为累加值
更换线程对应的cell索引
当前线程cell是否为空
冲突
初始化cell数组,长度为2仅初始化一个cell
结束
释放锁
开始
是
开始扩容
为空
成功
cas当前cell
add时发生冲突会先更换一次cell
重新开始循环
尚未加锁
加锁状态
为0
生成probe对应cell
加锁
未加锁cell引用未变化
cas base
cells未改变
cell已创建长度>0
已创建
cells长度为0
base
cell未创建
collide = false
uncontented=true
失败
循环开始
cas结果
会进入Cells初始化
Cells初始化
cell是否创建
有其他线程正在初始化
累加成功的情况1.未产生冲突时,base累加成功【add】2.当前线程对应的cell累加成功【add或longAccumulate】3.cell初始化成功【longAccumulate】4.cells初始化成功【longAccumulate】5.其他线程正在初始化cells时,base累加成功【longAccumulate】加锁情况:1.cells初始化时;2.cell初始化时;3.cells扩容时双重检查:所有加锁前后都存在状态检查AtomicLong与LongAdder1.cells为空则未发生竞争,采用AtomicLong相同的处理方式2.AtomiLong冲突集中;LongAdder冲突分散3.发生冲突时LongAdder会更换cell懒创建:1.为避免伪共享cell内存占用较大(一个缓存行),cell必要时才创建2.扩容前再多尝试一次,尽可能延后
线程第一冲突进入
尝试在Base上累加
当前线程对应的cell为空
cellsBusy
Cell
未冲突
扩容1倍并复制数据
是否成功
collide = true
暂不扩容,等下一次
并发时其他线程可能创建cell,此时cell不一定为空
collide = false
uncontented=false
不为空,发生过竞争
Cell初始化
!uncontented
不要扩容
cell是否为空
超过CPU数量或已扩容
!collide
未创建或长度=0
Cells扩容
核心属性,均被volatile修饰
不为空
cells初始化、cell初始化、cells扩容时需加锁
cell不为空长度大于0当前线程cell为空
已初始化
孙兵 WX:beyond-sunbing 2021-03-12
当前线程无对应的cell
0 条评论
回复 删除
下一页