首先HashMap死链问题出现在 jdk1.7 中,采用的是头插法。并且是在并发环境下发生的。
源码大致意思为:
while(){
保存 e.next
将 e 放入新数组的链表头
e = e.next;
}
假设 map 中元素为 a -> b -> null
- t1 线程中 a[e] -> b[next] -> null 被挂起
- t2 线程扩容过程:
- a -> null
- b -> a -> null
- 回到 t1 线程中 b[next] -> a[e] -> null,进行扩容
- t1 扩容流程:
- 扩容之后数组 ; 扩容前的数组
- a -> null ; b[e] -> a[next] -> null
- b -> a -> null ; b -> a[e] -> null[next]
- a <-> b (发生死链)