ConcurrentHashMap底层存储结构是什么(新手必看)
ConcurrentHashMap 是 Java 中支持高并发、高性能的线程安全的 HashMap 实现,它作为 java.util.concurrent 并发包的一部分,与 HashTable 和通过 Collections.synchronizedMap 包装的 HashMap 相比,提供了更高的并发级别,同时保证了线程安全,且在多线程环境中的性能远优于前两者的性能。
ConcurrentHashMap 的底层存储结构在 Java 8 之前和之后有所不同,这体现了不同版本间对高并发策略的优化。
ConcurrentHashMap 将数据分为若干段,每一段就像一个小的 HashMap,拥有自己的锁。当进行插入、删除等操作时,只需要锁定对应段,而不需要锁定整个 HashMap。这样,在并发环境下,只要操作涉及的数据位于不同段中,这些操作就可以同时进行,大大提高了并发性能。
ConcurrentHashMap 分段结构如下图所示:
在 Java 8 及之后的版本中,ConcurrentHashMap 使用了一种称为锁分离的技术。例如,更新操作(如 put()、remove() 等)通过对节点加锁来实现,而读取操作大部分时间是完全无锁的,并且通过使用 volatile 变量来保证内存可见性,从而实现更高的并发性和性能。
ConcurrentHashMap 是一种高效的并发 HashMap,通过不断地优化和改进,其底层存储结构从最初的分段锁机制演化为更精细的节点锁机制,有效地提升了在并发环境中的操作性能,在读取多写入少的场景下表现出色。
ConcurrentHashMap 的底层存储结构在 Java 8 之前和之后有所不同,这体现了不同版本间对高并发策略的优化。
Java 8之前的ConcurrentHashMap
在 Java 8 之前,ConcurrentHashMap 内部使用分段锁机制来管理数据。ConcurrentHashMap 将数据分为若干段,每一段就像一个小的 HashMap,拥有自己的锁。当进行插入、删除等操作时,只需要锁定对应段,而不需要锁定整个 HashMap。这样,在并发环境下,只要操作涉及的数据位于不同段中,这些操作就可以同时进行,大大提高了并发性能。
ConcurrentHashMap 分段结构如下图所示:

Java 8之后的ConcurrentHashMap
Java 8 对 ConcurrentHashMap 进行了重大改进,废弃了分段锁的设计,采用了一种更加精细的锁定机制,这种机制被称为节点锁,底层存储结构也变为了数组+链表+红黑树的复合结构,如下图所示。
- 数组:ConcurrentHashMap 的主干,存储数据的实际位置。
- 链表:在发生哈希冲突时,会使用链表来存储具有相同哈希值的节点。
- 红黑树:当链表的长度超过一定阈值(默认为 8)时,链表会转换为红黑树,以提高查找效率。
在 Java 8 及之后的版本中,ConcurrentHashMap 使用了一种称为锁分离的技术。例如,更新操作(如 put()、remove() 等)通过对节点加锁来实现,而读取操作大部分时间是完全无锁的,并且通过使用 volatile 变量来保证内存可见性,从而实现更高的并发性和性能。
ConcurrentHashMap 是一种高效的并发 HashMap,通过不断地优化和改进,其底层存储结构从最初的分段锁机制演化为更精细的节点锁机制,有效地提升了在并发环境中的操作性能,在读取多写入少的场景下表现出色。