ConcuccrentHashMap
2021-10-27 17:26:18 0 举报
ConcuccrentHashMap源码分析
作者其他创作
大纲/内容
调用FWD的find方法去nextTable里找
有数据且table已被初始化
PUT方法
获取当前桶的头节点
table是否为空
end
桶内已经有元素,使用sync 加锁“头结点”
进入FWD节点查询(当前正在扩容,该桶数据已被迁移)
元素个数大于阈值&&非空&&表长度未超
fullAddCount()cells初始化、重试
链表和红黑树结构,分开插入
return null
调用initTable()进行初始化;若其他线程正在扩容,该线程挂起
check值>=0
1.cells为空,cas Base失败;||2.当前线程命中cell为空;||3.cas更新当前cell失败
调用TreeBin的find方法遍历红黑树(加了读写锁)
Hash为MOVED(-1)
addCount()统计table元素数量,判断是否扩容
由于Node的元素val和指针next是用volatile修饰的,在多线程环境下线程A修改结点的val或者新增节点的时候是对线程B可见的。
Y
正常在桶中查询数据
进入TreeBin查询
再取一次Hash与头结点比较,避免被修改
eh=-2
元素hash值高低16位异或,再求与
cas插入节点
NULL
addCount()方法
eh=-1
(h ^ (h >>> 16)) & HASH_BITS;后面是避免hash值为负
二次判断
Cell数组未初始化||cas设置base失败
桶位头节点eh与元素hash值一致?
helpTransfer帮助扩容
check值为零,正在remove
GET方法
调用tranfer协助扩容/初始化扩容
收藏
0 条评论
下一页
为你推荐
查看更多
抱歉,暂无相关内容