ConcurrentHashMap是Java中线程安全的哈希表实现,属于java.util.concurrent包。它用来解决HashMap在多线程环境下不安全的问题,同时相比Hashtable和Collections.synchronizedMap()有更好的并发性能。以下基于jdk1.8说明。
一、核心原理
1. 线程安全实现(Java 8+)
-
CAS(Compare and Swap):用于无锁化的初始化、节点插入和计数器更新。
-
synchronized 锁细化:仅锁定单个桶(链表或红黑树的头节点),不同桶的修改互不阻塞。
-
volatile 变量:保证
Node
的val
和next
字段的可见性。
2. 数据结构
-
数组 + 链表 + 红黑树:
-
默认数组大小:16,负载因子:0.75。
-
链表长度 ≥ 8 时转换为红黑树(树化)。
-
树节点数 ≤ 6 时退化为链表(反树化)。
-
3. 哈希计算
-
扰动函数