【常见集合篇16】HashMap在JDK7多线程死循环

76 阅读1分钟

HashMap JDK7 下的数据结构

数组 + 链表

在数组扩容的时候,因为链表头插入法,在进行数据迁移的过程中,有可能导致死循环

image.png

原始数据 B -> A

线程1 A -> B 线程2 A -> B -> A

HashMap在JDK7多线程死循环

比如说,现在有两个线程

线程一:读取到当前hashmap数据,数据中一个链表,在准备扩容时,线程二接入了

线程二:也读取hashmap,直接进行扩容,因为头插法,链表的顺序会进行颠倒过来,比如原来顺序时AB,扩容之后的顺序是BA,线程二指向结束。

线程一:继续执行的时候就会出现死循环的问题。

线程一先将A移入新的链表,再将B插入到链头,由于另一个线程的原因,B的next指向了A,所以形成B->A->B。

当然,JDK8将扩容算法进行了调整,不再将元素加入链表头,而是尾插法,就避免了JDK7中的死循环的问题