ConcurrentHashMap原理图
2021-08-07 16:19:44 0 举报
介绍concurrentHashMap中put方法原理图,使用了cas和synchronized,实现了安全机制
作者其他创作
大纲/内容
ConcurrentHashMap
是
否
table为null,或length==0?
tab为null,或length==0?
计算key的hash值
初始化initTable()
是否替换元素
binCount>=8 ?
return null;
在次判断:tab为null,或length==0?
循环遍历Node数组table
重新循环
oldVal != null
ConcurrentHashMap比HashMap安全:(1)HashMap中,key和value可以为null,但是ConcurrentHashMap不能为空,否则抛出NPE异常;(2)在判断tab[cap&(key.hash-1)]有区别:hashMap是直接获取该节点位置是否为null;而ConcurrentHashMap是通过Unsafe.getObjectVolatile()获取最新值;如果是空值时,插入也有区别,ConcurrentHashMap采用CAS进行尝试插入;(3)如果该节点不是null,那么插入链表或红黑树的时候,有区别:hashMap直接进行插入,线程不安全;而ConcurrentHashMap是给当前位置的节点Node加锁,然后在进行插入,这个线程安全;
CAS操作成功
初始化tableinitTable()
binCount!= 0 ?
fh >= 0
执行sizeCtl = sc;并break,退出while循环。
红黑树
NPE异常
while ((tab = table) == null || tab.length == 0)
结束
1.这条红线是synchronized对节点进行加锁过程,实现的代码逻辑。2.关于这个添加元素线程安全型:(1)采用CAS原理;(2)采用synchronized+cas原理;3.ConcurrentHashMap是中key和value不能为null;4.ConcurrentHashMap数据结构:Node数组+链表+红黑树;
线程让出CPU执行权
return tab
1.在put元素的时候,才进行初始化Node数组,这个是懒加载模式。2.采用自旋CAS的方式初始化Node数组。
介绍ConcurrentHashMap中添加原理
链表
调用红黑树插入方法putTreeVal;binCount = 2
尝试使用CAS在该位置插入新值
f instanceof TreeBin
while循环Node数组tab
遍历到的key是否和插入的key相等
初始化完成
判断是链表,或红黑树?
转成红黑树treeifyBin()
进入循环
解锁
return oldVal;
是否在进行扩容:(fh = f.hash) == MOVED?
循环变量链表binCount = 1
break,退出for循环
数组第i个元素进行加锁synchronized (f)
sizeCtl为-1,表示已被其他线程占用
为何这个当前位置的Node节点,hash值为-1,就是扩容?
(sc = sizeCtl) < 0
创建Node数组,并初始化;
插入尾端
是,执行break
初始化,采用CAS自旋方式进行初始化。线程安全。
key 或 value 是null?
收藏
收藏
0 条评论
下一页