Skip to content

题目6:HashMap 与 ConcurrentHashMap ​

📊 评分:— | 📅 完成时间:待完成


📝 题目 ​

请介绍一下 HashMap 的底层数据结构。为什么 HashMap 线程不安全?ConcurrentHashMap 在 JDK1.7 和 JDK1.8 中分别是怎么实现线程安全的?


💬 我的回答 ​


📖 参考答案 ​

一、HashMap 底层结构 ​

  • JDK1.7:数组 + 链表
  • JDK1.8:数组 + 链表 + 红黑树

当链表长度超过阈值且数组容量足够时,会树化,降低查询复杂度。

二、HashMap 为什么线程不安全 ​

  • 多线程 put 可能导致数据覆盖
  • 扩容时可能出现数据迁移问题
  • 读写并发时可能拿到不一致数据

三、ConcurrentHashMap 的实现 ​

JDK1.7 ​

  • Segment 分段锁
  • 每个 Segment 类似一个小 HashMap
  • 锁粒度是 Segment

JDK1.8 ​

  • Node[] + CAS + synchronized
  • 初始化、插入空桶时优先用 CAS
  • 链表或树冲突时对桶头节点加 synchronized
  • 锁粒度细化到单个桶

四、面试追问 ​

  • 为什么 JDK1.8 去掉了 Segment
  • 为什么 size 统计不一定是强一致
  • ConcurrentHashMap 为什么不允许 key/value 为 null

🎯 面试标准话术 ​

"HashMap 在 JDK1.8 中是数组、链表、红黑树结构。它线程不安全,主要体现在并发 put、扩容和读写并发上。ConcurrentHashMap 在 JDK1.7 用 Segment 分段锁,在 JDK1.8 改成了 CAS 加 synchronized,把锁粒度降低到桶级别,吞吐更高。"

努力工作 享受生活