ConcurrentHashMap原理

§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。

本作品采用 CC BY-NC-SA 4.0 协议进行许可
使用 Hugo 构建
主题 StackJimmy 设计