详尽的 JDK 1.8 ConcurrentHashMap put 方法流程图
2021-06-15 10:43:13 0 举报
为你推荐
查看更多
非常详尽的 JDK 1.8 ConcurrentHashMap put 方法流程图
作者其他创作
大纲/内容
是
i
遍历到的Key 与将要插入的Key相等?
尝试使用 CAS 直接在该位置插入新值
fh 0
否
K 或 V 为 null ?
链表转为红黑树
插到链表尾部
Node
给数组第i个位置的节点加锁synchronized (f)
return null
结束 😂
初始化 tableinitTable()
NullPointerException
红黑树
CAS 操作成功?
帮助扩容helpTransfer()
return oldVal
重新进入循环
循环遍历数组 Table
链表元素个数 >= 8
Table
TreeBin
ConcurrentHashMap
调用红黑树的插入方法putTreeValbinCount = 2
fh = 0
i = (tab.length - 1) & hash
计算 key 的 hash 值
binCount 是否等于 0 ?
再次确认头结点是 否变化
数组第 i 个位置为 null ?i = (tab.length - 1) & hash
table 为 null 或 table 的长度为 0 ?
判断是链表还是红黑树fh >= 0?
是 break
决定是否替换元素
否,重新进入循环
解锁
size 添加 1,可能会引发扩容addCount()
链表
用 synchronized 对 table[i] 加锁
是否在进行扩容操作f.hash = MOVED
否 binCount == 0
oldVal 为 null ?
开始 💪
0 条评论
回复 删除
下一页