Hashmap的死周期是一个更常见的经典访谈问题,并且经常在大型制造商的采访中提出。到了一个死周期。JDK1.8后,官员完全解决了这个问题。
1.在分析数据插入的原因之前,我将带您了解JDK1.7中数据插入数据的原理以查看动画演示:
因为JDK 1.7中哈希姆普的基础存储结构使用数组和链接列表。
插入数据时,Hashmap使用头部插入,这意味着新插入的数据将从链接列表的节点插入。
因此,哈希图的扩展是在正常情况下的扩展过程。在我们的角度,旧的哈希图的节点将依次转移到新的哈希图。旧的hashmap传输链接列表元素的顺序为a,b和c,新的哈希图使用了头部插入方法。哈希姆普中的链接列表元素的顺序为c,b,A。
2.死周期的原因。接下来,我将带所有人通过动画演示充分了解Hashmap死亡周期的原因。我们遵循以下三个步骤,恢复由Hashmap并行扩展引起的死亡周期:
步骤1:线程启动,连接线程T1和线程T2正在准备扩大哈希图的容量。目前,T1和T2针对链接列表的Head节点a,T1和T2的下一个节点分别为T1.NEXT和T1和T2的下一个节点。T2.Next,它们都指向节点B。
步骤2:开始扩大容量。此时,假设使用线T2的时间胶片,它进入了休眠状态,并且螺纹T1开始执行扩展操作。直到螺纹T1扩展完成,螺纹T2被唤醒。
T1完成后的场景成为动画。
由于HashMap扩展使用了头部插入方法,因此在执行线程T1之后,链接列表中的订单顺序已更改。图中显示的T2指向节点A,而T2.Next指向节点B。
执行线程T1时,线程T2恢复执行,并发生死周期。
因为在T1执行容量后,节点B的下一个节点为a,并且指向T2螺纹的第一个节点为a,第二个节点为a,而第二个节点为B。该顺序与T1扩展之前的节点完全相反。T1的of为b至a,T2的顺序为a至b,因此nodes a和b节点形成了一个死循环。
3.该解决方案有三种常见的解决方案,可以避免哈希图的死周期的常见解决方案:1)。与线程一起安全地替换哈希图。我个人建议使用此解决方案。
2)已更换具有线程安全的容器,但其性能较低,不建议使用。
3)使用同步或锁定后,将其操作,这等同于多线程队列执行,这也会影响性能。不建议使用它。
4.总结一下Hashmap死周期仅发生在JDK1.7版本中。主要原因是JDK1.7中的哈希图。加上链接列表加上多线程并发症和扩展能力将形成一个死周期。在多线程环境中,建议使用concurrenthashmap。链接的活动周期。
以上是对哈希图死亡周期原因的分析。理解,关注赞美并且下次不会迷失的朋友。
我是我被延迟的文学汤姆。如果您还有其他问题或需要高定义的小型伙伴,请在评论区域留言。如果我的面试分析对您有帮助,请与一个按钮和三个连续的人分享您的手指。面试不再困难!3个人无法阅读
有必要单独模拟访谈,需要进行职业计划的学生可以注意Weixin公共帐户[Tom Bomb Architecture],并且有100,000+文字测试文件已被分类为PDF,以免费接收它!我是文学和艺术的汤姆
原始:https://juejin.cn/post/7096754777716410382