校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > java语言 > Map、set集合(后序会删除)
题目

JDK8 的 ConcurrentHashMap 原理?

解答

主要对 JDK7 做了三点改造:
① 取消分段锁机制,进一步降低冲突概率。
② 引入红黑树结构,同一个哈希槽上的元素个数超过一定阈值后,单向链表改为红黑树结构。
③ 使用了更加优化的方式统计集合内的元素数量。具体优化表现在:在 put、resize 和 size 方法中设计元素总数的更新和计算都避免了锁,使用 CAS 代替。

get 同样不需要同步,put 操作时如果没有出现哈希冲突,就使用 CAS 添加元素,否则使用 synchronized 加锁添加元素。

当某个槽内的元素个数达到 7 且 table 容量不小于 64 时,链表转为红黑树。
当某个槽内的元素减少到 6 时,由红黑树重新转为链表。在转化过程中,使用同步块锁住当前槽的首元素,防止其他线程对当前槽进行增删改操作,转化完成后利用 CAS 替换原有链表。
由于 TreeNode 节点也存储了 next 引用,因此红黑树转为链表很简单,只需从 first 元素开始遍历所有节点,并把节点从 TreeNode 转为 Node 类型即可,当构造好新链表后同样用 CAS 替换红黑树。

C 1条回复 评论
将将将将9566

ConcurrentHashMap中包含两个静态内部类HashEntry和Segment,HashEntry用来封装映射表的键值对,Segment用来充当锁的角色。每个Segment对象守护整个散列映射表的若干个桶。每个桶是由若干个HashEntry对象连接起来的链表。一个ConcurrentHashMap实例中包含由若干个Segment对象组成的数组。

发表于 2021-04-06 10:20:07
0 0