ConcurrentHashMap
2020-07-26 17:09:40 35 举报
concurrenthashmap
作者其他创作
大纲/内容
ListNode
初始化table容量为16
transfer()
本质上是利用了hash & n为0还是是为1把节点上的链式存储一分为二存储,要么在i位置,要么在i+n位置。
true
TreeNode
使用synchronized给tab【i】位置加锁
helpTransfer()扩容
false
sizeCtl :默认为0,用来控制table的初始化和扩容操作-1 代表table正在初始化或初始化nextTable:默认为null,扩容时新生成的数组
table执行nextTablesizeCtl设置为新数组长度的0.75倍
transfer(扩容)
在旧数组元素向新数组中转移时给当前节点上锁
将节点转化为treeBin插入到二叉树中
遍历链表有key相同的节点,新value替换旧value,否在在链表末尾插入该节点
table是否为空
判断是否需要将链表转化为红黑树
1.7和1.8的区别1.8使用优化后的Synchronized锁替代了ReentrantLock,锁粒度更小,不是每次都要加锁,CAS失败了再加锁
ConcurrentHashMap
构造nextTable对象,容量是之前的两倍
这个位置上的hash值为-1
addCount()z中判断是否需要扩容
spread(key.hashCode())(h ^ (h >>> 16)) & HASH_BITS
判断节点类型
put操作结束
putVal()
利用CAS把Node插入到当前位置
判断当前位置上有无元素
为什么能并发扩容?在多线程并发扩容时会一个线程如果拿到了当前位置上的Node,它会使用synchronized加锁,标识当前节点为forwardingNode。其他线程发现当前位置上有其他线程扩容时,它会扩容下一个位置上的元素。
最后判断旧数组中的链表是否要转化成二叉树
0 条评论
下一页