📚 分类
集合
🕵🏽‍♀️ 问题描述
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,所以没有形成循环。
📖 问题信息
📈 浏览次数:17 | 📅 更新时间:2025-12-01 22:02:11
📦 创建信息
🏷️ ID:93 | 📅 创建时间:2024-11-17 23:34:01