Striped64-Accumulate执行图
2020-12-12 02:16:46 0 举报
JUC-Striped64-Accumulate方法执行图 曹冲 2020-12-12
作者其他创作
大纲/内容
N
初始化cells数组,此时cellsBusy会cas为1,初始化完成并将累加值插入cells缓存区
cells:分段锁实现的一个缓存数组槽,用来存放cell;cell:槽属性,具有volatile变量;cellsBusy:cells的cas状态值,表示是否被线程占用;NCPU:机器最大cpu数;collide:标识cells是否可扩容;base:最后一次的累加值,但不是最终值,需要操作sum()函数来计算最终值。
开始
创建一个新的Cell,将Cell写入cells缓存区(前提保证cellsBusy=0,操作值时会cas方式修改为1)
获取线程的探测值getProbe(),如果为0则初始化线程探测值
Y
已知CAS是失败情况
如果cells数组不为空,且长度大于0
使用cas直接修改base原来的数值
使用CAS操作cells缓冲区中已存在Cell的值
计算该线程探测下Cell为空
collide最后一个缓存槽已满,不允许扩容
重新计算线程探测的hash后继续
如果cells数组为空,且没有其他线程在初始化扩容
扩容为原来cells缓存槽大小的2倍
累加Cell中的值,切记这里只是cells中的其中一个
结束
当前cells是否大于NCPU个数,或者缓存cells发生了扩容
JUC-Striped64-Accumulate方法执行图曹冲 2020-12-12
0 条评论
下一页