你知道HashMap在高并发下可能会出现哪些问题吗( 五 )

看一下transfer的过程:

你知道HashMap在高并发下可能会出现哪些问题吗

这里引用酷壳陈皓的博文:

并发下的Rehash

1)假设我们有两个线程。我用红色和浅蓝色标注了一下。

我们再回头看一下我们的 transfer代码中的这个细节:

而我们的线程二执行完成了。于是我们有下面的这个样子。

你知道HashMap在高并发下可能会出现哪些问题吗

注意,因为Thread1的 e 指向了key(3),而next指向了key(7),其在线程二rehash后,指向了线程二重组后的链表。我们可以看到链表的顺序被反转后。

2)线程一被调度回来执行。

先是执行 newTalbe[i] = e;然后是e = next,导致了e指向了key(7),而下一次循环的next = e.next导致了next指向了key(3)

推荐阅读