2026-10-24 00:45:48
ConcurrentHashMap是Java中线程安全的HashMap实现,通过分段锁(JDK 1.7)或CAS+synchronized(JDK 1.8)实现高并发性能,核心特点包括细粒度锁控制、无锁读取、渐进式扩容及死锁预防机制。
一、JDK 1.7与JDK 1.8的实现差异1. JDK 1.7:分段锁(Segment Locking)
细粒度锁:不同Segment可并发访问,减少锁竞争。
高并发性:适合多线程读写不同数据段的场景。
内存占用高:Segment数组开销较大。
锁粒度仍较粗:同一Segment内操作仍需加锁,高并发下可能竞争。

CAS:对Node数组的原子操作(如插入新节点)。
synchronized:哈希冲突时对链表或红黑树加锁,保证数据一致性。
实现简单:代码结构更清晰。
内存占用少:无需Segment数组,节省空间。
锁粒度更细:锁降至Node级别,并发性能更高。
多线程插入不同哈希值的key时,可并发操作不同Node,无需加锁。
哈希冲突时,仅对冲突链表/红黑树加锁,其他线程仍可操作其他Node。
CAS:保证Node操作的原子性(如compareAndSet)。
synchronized:仅在冲突时加锁,减少阻塞。
示例:预估1000个元素,初始容量为(1000 / 0.75 + 1) ≈ 1334。
将Node数组分成多个部分,每个线程负责迁移一部分。
迁移时对部分加锁,完成后释放锁,允许其他线程访问。
细粒度锁控制(Node级别)减少竞争。
CAS操作避免ABA问题。
避免循环依赖:如Node A依赖Node B,而Node B又依赖Node A。
避免长时间持锁:缩短synchronized块执行时间。
使用超时机制:如tryLock(timeout),超时后放弃锁。
高并发读写:如缓存、会话管理、计数器等。
需要线程安全且性能敏感:替代Hashtable或Collections.synchronizedMap。
避免null键/值:ConcurrentHashMap不允许null键或值。
迭代器弱一致性:遍历时可能反映已修改的集合状态,但不保证实时性。
容量规划:合理设置初始容量和负载因子,避免频繁扩容。
ConcurrentHashMap通过分段锁(JDK 1.7)或CAS+synchronized(JDK 1.8)实现了高效的线程安全设计,兼顾了并发性能与内存占用。其核心优势包括:
在实际应用中,需根据JDK版本选择合适实现,并注意容量规划、避免循环依赖等细节,以充分发挥其性能优势。