并发List、Set、ConcurrentHashMap底层原理
2022-11-22 15:12:45 0 举报
集合底层原理
作者其他创作
大纲/内容
A
2
链表转成红黑树
正常扩容
修改原值返回原值
是
根据key来计算hash值
此时还没来得分配就切换到ThreadB
ThreadA
是否链表
initTable();进行初始化容量
5
helpTransfer帮助扩容
table[i]是链表
是否正在扩容
0
否
1
链表尾部添加值
AX02
size大于阙值
BX01
e
链表已有
7
1.7 haspMap多线程扩容头插法可能会产生死循环
4
B
resize()创建数组table并设置阙值
3
casTabAtnew Node存进去
table[i]是否为空
插入红黑树
1.8ConcurrentHashMap底层是基于sychronized+CAS+Node+红黑树来控制实现的当put的时候,经过位运算定位到具体的某个Node节点进行插入,此时会用sychronized在这个Node的head节点上进行加锁,赋值操作都用CAS控制。不影响其他元素的读写。所以1.8后的锁的粒度更细了,效率更高了
扩容转移第二个元素
直接插入newNode
是否红黑树
table[i]是一个节点,且hash值和key值相同
数组是否为空
6
resize()扩容,转移到新表并设置阙值
链表长度大于8
数组
hash相同
ThreadA 线程拿到的数组
JAVA8 hashMap put流程
扩容转移第一个元素
计算在数组中的位置i
红黑树插入值
同时间操作
table[i]是红黑树
synchronized (f)该节点加锁Node
初始化
则覆盖原值
遍历树
size++
1.8ConcurrentHashMap put流程
end
其他链表或者红黑树
遍历链表
尾部插入Node
ThreadB
树里已有
hash没有冲突
0 条评论
下一页