【Java面试】面试被问:ConcurrentHashMap 底层实现原理?高手的回答堪称完美_哔哩哔哩_bilibili
JDK 1.7中的实现:
在 jdk 1.7 中,ConcurrentHashMap 是由 Segment 数据结构和 HashEntry 数组结构构成,采取分段锁来保证安全性。Segment 是 ReentrantLock 重入锁,在 ConcurrentHashMap 中扮演锁的角色,HashEntry 则用于存储键值对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组,一个 Segment 里包含一个 HashEntry 数组,Segment 的结构和 HashMap 类似,是一个数组和链表结构。
JDK 1.8中的实现:
关于这个问题,我从三方面进行回答:
ConcurrentHashMap本质上也是一个HashMap,在JDK1.8 的实现是由 数组+单链表+红黑树的数据结构来实现。开始的时候创建一个长度为16的数组。当发生Hash冲突时,HashMap使用拉链法解决,就是在node.next = new Node()。当这个链表长过长就会将链表整理为红黑树、当链表长度过小,红黑树有退化成单链表。
并发控制使用Synchronized 对单链表的头节点进行加锁进行实现。由于每次加锁只锁住某个节点,所以性能很好。
Java中的集合类主要由Collection和Map这两个接口派生而出,其中Collection接口又派生出三个子接口,分别是Set、List、Queue。其中
这些接口拥有众多的实现类,其中最常用的实现类有HashSet、ArrayList、LinkedList、ArrayDeque、HashMap等。