扫码关注微信公众号
回复“面试手册”,获取本站PDF版
回复“简历”,获取高质量简历模板
回复“加群”,加入程序员交流群
回复“电子书”,获取程序员类电子书
JDK1.7
在JDK1.7中,ConcurrentHashMap
采用Segment
数组 + HashEntry
数组的方式进行实现。Segment
实现了ReentrantLock
,所以Segment
有锁的性质,HashEntry
用于存储键值对。一个ConcurrentHashMap
包含着一个Segment
数组,一个Segment
包含着一个HashEntry
数组,HashEntry
是一个链表结构,如果要获取HashEntry
中的元素,要先获得Segment
的锁。
JDK1.8
在JDK1.8中,不在是Segment
+HashEntry
的结构了,而是和HashMap
类似的结构,Node数组+链表/红黑树,采用CAS
+synchronized
来保证线程安全。当链表长度大于8,链表转化为红黑树。在JDK1.8中synchronized
只锁链表或红黑树的头节点,是一种相比于segment
更为细粒度的锁,锁的竞争变小,所以效率更高。
总结一下:
- JDK1.7底层是
ReentrantLock
+Segment
+HashEntry
,JDK1.8底层是synchronized
+CAS
+链表/红黑树 - JDK1.7采用的是分段锁,同时锁住几个
HashEntry
,JDK1.8锁的是Node节点,只要没有发生哈希冲突,就不会产生锁的竞争。所以JDK1.8相比于JDK1.7提供了一种粒度更小的锁,减少了锁的竞争,提高了ConcurrentHashMap
的并发能力。
本站链接:https://www.mianshi.online,如需勘误或投稿,请联系微信:lurenzhang888
点击面试手册,获取本站面试手册PDF完整版