ConcurrentHashMap.initTable方法源码流程图
2021-03-12 09:42:04 12 举报
ConcurrentHashMap.initTable方法源码流程图
作者其他创作
大纲/内容
Thread.yield()
sc = n - (n >>> 2);
((sc = sizeCtl) < 0)
int n = (sc > 0) ? sc:DEFAULT_CAPACITY;
大概率就是-1,表示其它线程正在进行创建table的过程,当前线程没有竞争到初始化table的锁。
1.如果当前线程是第一次创建map.table的线程话,sc表示的是 下一次扩容的阈值2.表示当前线程 并不是第一次创建map.table的线程,当前线程进入到else if 块 时,将sizeCtl 设置为了-1 ,那么这时需要将其修改为 进入时的值。
initTable
最终赋值给 map.table
return tab
((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 默认值.
自旋 条件:map.table 尚未初始化
这里为什么又要判断呢? 防止其它线程已经初始化完毕了,然后当前线程再次初始化..导致丢失数据。条件成立,说明其它线程都没有进入过这个if块,当前线程就是具备初始化table权利了。
while ((tab = table) == null || tab.length == 0)
sizeCtl = sc;
0 条评论
下一页