HashMap死循环是一个比较常见、也是比较经典的面试题,在大厂的面试中也经常被问到。HashMap的死循环问题只在JDK1.7版别中会出现,首要是HashMap自身的作业机制,再加上并发操作,然后导致出现死循环安全教育日。JDK1.8今后,官方完全解决了这个问题。
1、数据刺进原理
在分析原因之前,我先带大家面试技巧了解一下JDK1.7中HashMap刺进数据的原理,来看动画演示:
由于JDK1.7中HashMap的底层存储结构选用的是数组加链表的方法。
而HashMap在数据刺进时又链表反转选用的是头插法,也就面试问题大全及答案大全数组的界说是说新刺进的数据会从链表的头节点进行面试技巧和注意事项刺进。
因此,HashMap正常情况下的扩容就是是这样一个过程。我们来看,旧HashMap的节点会依次搬运到新的HashMap中,旧HashMap搬运链表元素的次序是A、B、C,而新Hash面试Map运用的是头插法刺进,所以,扩安全教育平台登录入口容完成后数组去重方法终究在新HashMap中链表元素的次序是C、B、A。
2、导面试毛遂自荐简略大方致死循环的原数组初始化因
接下来,安全教育手抄报我通过动画演示的方法,带大家完全理解构成HashMap死循环的原因。我们按以下三个步骤来复原并发场景下HashMap扩容导致的死循环问题:
第一步:链表的创立线程数组c言语启链表的特点动,有线程T1和线程T2都准备对HashMap进行扩容操作,此时多线程T1和T2指向的都是链表的头节点A,而面试毛遂自荐一分钟T1和T2的下一链表的定义个节点分别是T1.next和T2.安全教育日next,它们都指向B节点。
第二步:开始扩容,这时候,假设线程数组排序T2的时刻片用完,进入了休眠状况,而多线程面试题线程面试问题大全及答案大全T1开始履安全生产法行扩容操作,一直到线程T1扩容完成后,线程T2才被唤醒。
T1完成扩容之后的场景就变数组c言语成动画所数组去重方法示链表逆置的这样。
由于HashMap扩容选用的是头插法,线程T1履行之后,链表中的节点次序产生了改变。但线程T2关于产生的全部仍是不可知的,所以它指向的节点引证依然没变。如图所示,T2指向的是A节点,T2.next指向的是安全教育平台登录B节点。
当线程T1履行完成之后,线程T2康复履行时,死循环就产生了。
由于T1履行完扩容多线程的应用场景之后,B节点的下一个节点是A,而T2线程指向的首节点是A,第二个节点是B,这个次序刚好和T1扩容之前的节点次序是相反的。T1履行完之后的顺链表的特色序是B到A,而T2的次序是A到B,这样A节点和B节点就构成了死循环。
3、数组公式解决面试自我介绍3分钟通用数多线程编程组初始化计划
防止HashMap产生死循环的常用解决计划有三个数组c言语:
1)、运用线程安全的Conc安全工程师ur链表逆置rentHa数组排序shMap代替HashMap,个人引荐运用此计划。
2)、多线程面试题运用线程安全的容器Hashtable代替数组的定义链表结构,但它功能较低,不主张运用。
3)、运用synchroniz安全工程师ed或Lock加锁之后,再进行操作,相当于多线程排队履行,也会影响功能,不主张运用。
4、总结
HashMap死循环只产生在JDK1.7版别中,首要原因是JDK1.7中的HashMap,在头插法加链表加多线程并发加扩容这几个景象累加到一起多线程的实现方式就会构成面试毛遂自荐一分钟死循环。多线程环境下主张选用ConcurrentHashMap代替。在JDK1.8中,HashMap改成了尾插法,解决了链表死循环的问题。
以上就是关于HashMap死循环原因的分析,听懂的小伙伴数组指针,重视点个赞,下次不迷路。
我是被编程耽搁的文艺Tom,如果还有其他疑问或者需要高清无码图的小伙伴,请在谈论区留言。如果我的面试解析对你有协助,请动动手指一键三连共享给更多的人。重视我,面试不再难多线程是什么意思!3人未读
需要1v1单独模仿面试,以及需要做职业规划的同学数组去重方法可重视薇信大众号【安全教育手抄报Tom弹架构】,还有多线程下载10万+字面试文档现已整理成PDF可免费收取! 我是被编程耽搁的文艺Tom,