扫码关注微信公众号
回复“面试手册”,获取本站PDF版
回复“简历”,获取高质量简历模板
回复“加群”,加入程序员交流群
回复“电子书”,获取程序员类电子书
这里经常会将jdk1.7中的
ConcurrentHashMap
和jdk1.8中的ConcurrentHashMap
的实现方式进行对比。
JDK1.7
在JDK1.7版本中,ConcurrentHashMap
的数据结构是由一个Segment
数组和多个HashEntry
数组组成,Segment
存储的是链表数组的形式,如图所示。
从上图可以看出,ConcurrentHashMap
定位一个元素的过程需要两次Hash的过程,第一次Hash的目的是定位到Segment,第二次Hash的目的是定位到链表的头部。两次Hash所使用的时间比一次Hash的时间要长,但这样做可以在写操作时,只对元素所在的segment枷锁,不会影响到其他segment,这样可以大大提高并发能力。
JDK1.8
JDK1.8不在采用segment的结构,而是使用Node数组+链表/红黑树的数据结构来实现的(和HashMap
一样,链表节点个数大于8,链表会转换为红黑树)
如下图所示
从上图可以看出,对于ConcurrentHashMap
的实现,JDK1.8的实现方式可以降低锁的粒度,因为JDLK1.7所实现的ConcurrentHashMap
的锁的粒度是基于Segment,而一个Segment包含多个HashEntry。
本站链接:https://www.mianshi.online,如需勘误或投稿,请联系微信:lurenzhang888
点击面试手册,获取本站面试手册PDF完整版