扫码关注微信公众号

回复“面试手册”,获取本站PDF版

回复“简历”,获取高质量简历模板

回复“加群”,加入程序员交流群

回复“电子书”,获取程序员类电子书

当前位置: Java > Java并发高频面试题 > 52.java中ConcurrentHashMap是如何实现的?

这里经常会将jdk1.7中的ConcurrentHashMap和jdk1.8中的ConcurrentHashMap的实现方式进行对比。

JDK1.7

在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry数组组成,Segment存储的是链表数组的形式,如图所示。

concurrentHashMap-jdk1.7
concurrentHashMap-jdk1.7

从上图可以看出,ConcurrentHashMap定位一个元素的过程需要两次Hash的过程,第一次Hash的目的是定位到Segment,第二次Hash的目的是定位到链表的头部。两次Hash所使用的时间比一次Hash的时间要长,但这样做可以在写操作时,只对元素所在的segment枷锁,不会影响到其他segment,这样可以大大提高并发能力。

JDK1.8

JDK1.8不在采用segment的结构,而是使用Node数组+链表/红黑树的数据结构来实现的(和HashMap一样,链表节点个数大于8,链表会转换为红黑树)

如下图所示

 concurrentHashMap-jdk1.8
concurrentHashMap-jdk1.8

从上图可以看出,对于ConcurrentHashMap的实现,JDK1.8的实现方式可以降低锁的粒度,因为JDLK1.7所实现的ConcurrentHashMap的锁的粒度是基于Segment,而一个Segment包含多个HashEntry。


点击面试手册,获取本站面试手册PDF完整版