【图解】面试题:为什么HashMap会产生死循环

注意:HashMap死循环只会发生在JDK1.7,根本原因是由采用头插法在多线程下的扩容规则所致

(1)JDK1.7中HashMap采用底层结构是数组+链表,在key值发生hash碰撞后,元素entry会采用头节点的插入方式,插入到链表的头部
在这里插入图片描述
(2)数组长度到达负载临界值触发数组扩容,由于是头插法,原来链表的顺序是A->B->C,扩容后变为C->B->A
在这里插入图片描述
(3)假设同时有线程T1与T2对数组进行扩容

  1. T1、T2同时指向A节点,那么T1.next与T2.next同时指向B节点。
  2. 假设T2让出时间片,T1线程先进行扩容,那么T1线程执行后的结果是链表的结构变为C->B->A,此时T2的没有感知,在其工作内存中仍然是T2指向A,T2.next指向B。
  3. 此时T2恢复执行,死循环就此产生。

在这里插入图片描述

posted @   debug的勇士  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示