JDK源码-LongAdder
2021-11-25 13:00:35 0 举报
LongAdder的add方法内部流程
作者其他创作
大纲/内容
开始自旋
N
for(;;)
对cells加锁
N-竞争失败
Y-cell尚未初始化
N-cells已经初始化
线程对应的cell == null
cells被抢占
wasUncontended = true
Y-结束
Y-cells已经初始化
在cell上做cas
N-cell已初始化
N-cells已被抢占
Y-cells长度达到最大值,或者 as 值过期
Y-顺利
N-自旋重试
没有出错?
collide = false
Y-成功
LongAdder::add
自旋重试
cas成功?
cells == null || (cells.length - 1)<0
尝试对对应cell初始化,然后解锁
cells != null && cells.length>0
N-cells没有初始化
cellsBusy == 0
Y-存在竞争
对base做cas
wasUncontented=false
Striped64::longAccumulate
Y-加锁成功
N-没有竞争
rehash线程
N-cells可锁
Y-cells处于初始化或扩容阶段
对对应cell做cas
N-加锁失败
Y-线程竞争修改失败
N-cell已经初始化
尝试初始化cells,并对对应cell做cas,然后解锁
cells.length >= NCPU || cells != as
上一个slot非空则true,true表示可以扩容
加锁成功?
wasUncontented=true
cells可锁且加锁成功?
collide == false
Y
Y-cells还没初始化
Y-这个cell上还没有过竞争
N-失败
collide = true
cells != null
wadUncontented == false
成功?
Y结束
收藏
0 条评论
回复 删除
下一页