§2.3.2 ConcurrentHashMap原理
考察意图:是否理解ConcurrentHashMap在JDK 7/8的演进及JDK 8的改进要点。
回答样板:
JDK 7(分段锁):
- 数据结构:Segment数组 + HashEntry数组 + 链表
- Segment继承ReentrantLock,默认16个Segment
- 理论上支持16个线程并发写(每个Segment一把锁)
- 并发度固定不可动态调整
JDK 8(CAS + synchronized):
- 数据结构:Node数组 + 链表/红黑树
- put时CAS尝试插入空桶,CAS失败则synchronized锁桶头节点再插入
- 锁粒度从Segment级别(一锁锁一段)细化到桶级别(一锁锁一个桶),并发度更高
- 扩容支持多线程并发——transferIndex分段迁移,每个线程负责一段区域的rehash
- JDK 8改synchronized而非ReentrantLock的原因:JDK 6后synchronized性能足够;省去Segment对象的内存开销;锁粒度更细带来的收益远超锁机制本身的微小差异
陷阱提示:仍停留在JDK 7分段锁的理解;不知道JDK 8为什么改CAS+synchronized。