集合
hashMap在1.7情况下的多线程死循环问题
jdk7的的数据结构是:数组+链表 在数组进行扩容的时候,因为链表是头插法,在进行数据迁移的过程中,有可能导致死循环
❒ 在jdk1.7的hashmap中在数组进行扩容的时候,因为链表是头插法,在进行数据迁移的过程中,有可能导致死循环 比如说,现在有两个线程 ✔ 线程一: 读取到当前的hashmap数据,数据中一个链表,在准备扩容时,线程二介入 ✔ 线程二: 也读取hashmap,直接进行扩容。因为是头插法,链表的顺序会进行颠倒过来。比如原来的顺序是AB,扩容后的顺序是BA,线程二执行结束。 ✔ 线程一: 继续执行的时候就会出现死循环的问题。 ✔ 线程一: 先将A移入新的链表,再将B插入到链头。最终状态 B → A → B → A, 此时A不再指向null,而是指向B,所以形成循环。 ✔ 当然,JDK8将扩容算法做了调整,不再将元素加入链表头(而是保持与扩容前一样的顺序),尾插法,最终状态 A → B → A → B,此时B指向null,所以没有形成循环。