HashMap JDK7 下的数据结构
数组 + 链表
在数组扩容的时候,因为链表头插入法,在进行数据迁移的过程中,有可能导致死循环
原始数据 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中的死循环的问题