Collections—ConcurrentHashMap
2023-04-15 19:14:03 5 举报
ConcurrentHashMap并发安全Map实现源码流程图
作者其他创作
大纲/内容
取出数组中的值 return e.val;
让出线程资源Thread.yield();
失败重试
binCount = 2;
判断红黑树else if (eh < 0)
设置扩容阈值 sizeCtl = sc;
初始化数组tab = initTable();
ek = e.key) == key || (ek != null && key.equals(ek)
链表长度大于等于8binCount >= TREEIFY_THRESHOLD
binCount = 0)失败重试
false
true底层数组还未初始化
true当前数组不在扩容,且不是树,是链表
true
hash运算,让值尽可能分布均匀int hash = spread(key.hashCode());
false循环失败重试
遍历链表,向其中添加值binCount = 1;binCount ++;
sizeCtl最开始为0,表示还未初始化if ((sc = sizeCtl) < 0)
while ((tab = table) == null || tab.length == 0)循环失败重试机制
开始
return null
回到开始循环位置进行重试
else if (f instanceof TreeBin)
if (fh >= 0)
true进行底层数组初始化操作
退出循环break;
concurrentHashMap.get(key)
判断hash冲突eh = e.hash) == h
算出key的hash值int h = spread(key.hashCode());
key或者value为null时抛出空指针异常 if (key == null || value == null) throw new NullPointerException();
返回初始化好的数组 return tab;
判断节点上的hash属性为-1else if ((fh = f.hash) == MOVED)
if (binCount != 0)
synchronized (f)hash冲突时对数组的添加操作加同步锁
if (tab == null || (n = tab.length) == 0)
循环失败重试
扩容transfer()
值添加成功退出循环break;
break;退出循环
返回链表中的值while ((e = e.next) != null)if (e.hash == h && ((ek = e.key) == key || (ek != null && key.equals(ek)))) return e.val;
0 条评论
下一页