0
点赞
收藏
分享

微信扫一扫

ConcurrentHashMap底层实现

ConcurrentHashMap

ConcurrentHashMap底层实现
ConcurrentHashMap底层实现
ConcurrentHashMap : put方法的逻辑
1.判断Node[]数组是否初始化,没有则进行初始化操作
2.通过hash定位数组的索引坐标,是否有Node节点,如果没有则使
用CAS进行添加(链表的头节点),添加失败则进入下次循环。
3.检查到内部正在扩容,就帮助它一块扩容。
4.如果头节点f!=null,则使用synchronized锁住f元素(链表/红黑二叉树的
头元素)
4.1如果是Node(链表结构)则执行链表的添加操作。
4.2如果是TreeNode(树型结构)则执行树添加操作。
5.判断链表长度已经达到临界值8,当然这个8是默认值,大家也可以去做调整,当节点数超过这个值就需要把链表转换为树结构。

ConcurrentHashMap总结∶比起Segment,锁拆得更细

首先使用无锁操作CAS插入头节点,失败则循环重试
若头节点已存在,则尝试获取头节点的同步锁,再进行操作

ConcurrentHashMap:别的需要注意的点

size()方法和mappingCount()方法的异同,两者计算是否准确?
多线程环境下如何进行扩容?

HashMap线程不安全,数组+链表+红黑树
Hashtable线程安全,锁住整个对象,数组+链表
ConccurentHashMap线程安全,CAS+同步锁,数组+链表+红黑树HashMap的key、value均可为null,而其他的两个类不支持

举报

相关推荐

0 条评论