HashMap是非线程安全类,在java7多线程扩容机制下链表变成循环链表,出现循环引用问题。
解释:
1、HashMap的数据结构是 数组+链表结构。
2、扩容方式是 创建一个数组长度是原数组2倍的新数组。遍历原数组,将每个数组链表上的元素重哈希,通过头插法放入到对应的新数组位置上,遍历完后改变数组指针。
在多个线程检测到并进行扩容操作时,线程一在扩容到 准备将某个链表上的第一个元素k1移到新数组时挂起,此时有两个局部变量,第一个变量e指向k1,第二个变量next指向k1的下一个元素k2;然后线程二使用头插法完成扩容操作,此时k2的下一个元素正好是k1并且在同一个链表上。注意在线程一中next指向的是k2,而实际上k2此时是k1的前一个元素。继续线程一的扩容将k1放入到新数组中,在将k2放入到新数组,而后放入到新数组中的元素又是k1。这样就形成了死循环。
HashMap的循环引用
最新推荐文章于 2022-03-12 14:35:19 发布