ConcurrentHashMap.initTable方法源码流程图
2022-11-08 09:07:37 5 举报
ConcurrentHashMap jdk8 初始化流程
作者其他创作
大纲/内容
cas+自旋,保证线程安全,对数组进行初始化操
Thread.yield()
sc = n - (n >>> 2);
2. 再次判空,保证初始化一次
((sc = sizeCtl) < 0)
int n = (sc > 0) ? sc:DEFAULT_CAPACITY;
大概率就是-1,表示其它线程正在进行创建table的过程,当前线程没有竞争到初始化table的锁,让出cpu
initTable
最终赋值给 map.table
return tab
cas修改sizeCtl的值为-1,修改成功,进行数组初始化,失败,继续自旋
((tab = table) == null || tab.length == 0)
table = tab = nt;
n >>> 2 => 等于 1/4 n n - (1/4)n = 3/4 n => 0.75 * nsc 0.75 n 表示下一次扩容时的触发条件。
tab 引用map.tablesc sizeCtl的临时值
sc大于0 创建table时 使用 sc为指定大小,否则使用 16 默认值.
1. cas+自旋,保证线程安全,对数组进行初始化操
这里为什么又要判断呢? 防止其它线程已经初始化完毕了,然后当前线程再次初始化..导致丢失数据。条件成立,说明其它线程都没有进入过这个if块,当前线程就是具备初始化table权利了。
while ((tab = table) == null || tab.length == 0)
sizeCtl = sc;
0 条评论
下一页