为什么死磕 HashMap 和 ConcurrentHashMap 源码

很多转岗或准备补基础的开发者,简历上写着“精通 Java 基础”,但只要面试官追问一句“JDK7 扩容时为什么会引发死锁”或者“JDK8 的 ConcurrentHashMap 为什么放弃分段锁”,当场就卡壳。背八股文能应付笔试,但遇到真实排查线上死锁或者性能瓶颈时就两眼一抹黑。这门资料聚焦的正是这个痛点:不讲基础用法,直接拿 JDK7 到 JDK8 的底层源码开刀,剖析多线程并发下的数据结构演变。如果你连基本的链表数组都没自己手写过,或者没看过 put 和 get 流程,建议先去补完基础数据结构再来看,否则源码追踪环节会让你严重脱节。这里默认你已经知道哈希冲突、负载因子这些概念,缺的是并发环境下内存可见性和锁演化的深层原理。

核心模块怎么看,配套资料怎么练

这份资料内容非常聚焦,建议按顺序啃,不要跳着看。第一块是死锁分析,重点看旧版本扩容时链表成环的底层逻辑,自己要在纸上画出多线程状态下的节点引用倒置过程;第二块是 JDK7 的分段锁源码,搞懂它怎么通过二次哈希把锁粒度降到桶级别;第三块是 JDK8 的新版实现,核心是对比它为什么改用 CAS 加 synchronized 来锁单个桶,以及红黑树退化触发条件。配套练习方面,不要干看视频,必须打开你的本地集成环境,对着课程线索把对应版本的源码断点跑一遍。自己写一个多线程并发模拟类,不断触发扩容边界值,观察节点状态。资料里提到的每一段源码,都要自己在本地环境里跟进去看变量流转,把死锁的复现条件亲手跑通一次,比背十遍面试题都管用。

学完能独立解决什么具体问题

看完这套源码剖析,你不应该只停留在“能背出结论”的层面,而是要具备独立排查和设计推演能力。首先,在面试被问到并发容器底层差异时,你能脱稿画出 JDK7 到 JDK8 的数据结构变迁图,讲清楚死锁的成因链路,而不是含糊其辞说“线程不安全”。其次,在实际业务里遇到高并发场景,你能根据具体的读写比例和冲突频率,准确判断是否该用并发容器,以及预估它在你设定的吞吐量下会不会退化成链表导致性能雪崩。最后,如果线上真的出现 CPU 飙高或者疑似死循环,你能通过堆栈分析快速定位到是不是哈希槽被恶意打满或者并发扩容引发的环链。带着这些具体的能力缺口去对照学习,缺哪块补哪块,别假装看两眼源码就全通了,踏踏实实把环境跑起来才是正道。

课程目录

1 HashMap2-死锁分析 (17:48)
2 HashMap3-JDK7的ConcurrentHash源码 (32:25)
3 JDK8的ConcurrentHashMap源码解析 (07:18)