iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >hashMap扩容时应该注意的死循环问题有哪些
  • 496
分享到

hashMap扩容时应该注意的死循环问题有哪些

2023-06-15 11:06:14 496人浏览 薄情痞子
摘要

小编给大家分享一下HashMap扩容时应该注意的死循环问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!hashMap死循环原因: jdk1.7时使用头插入

小编给大家分享一下HashMap扩容时应该注意的死循环问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

hashMap死循环

原因: jdk1.7时使用头插入法 ,1.8之后改成了尾插入法解决了这个问题

HashMap死循环问题图解

在HashMap的数组真实长度达到阈值后,会调用扩容方法:

void resize(int newCapacity) {        Entry[] oldTable = table;        int oldCapacity = oldTable.length;        if (oldCapacity == MAXIMUM_CAPACITY) {            threshold = Integer.MAX_VALUE;            return;        }         Entry[] newTable = new Entry[newCapacity];        transfer(newTable, initHashSeedAsNeeded(newCapacity));        table = newTable;        threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);    }

这里可以看到如果有两个线程A和B,那么在调用transfer方法之前会在各自的线程中创建新的数组,然后进入到transfer方法中将节点转移,再看transfer方法:

void transfer(Entry[] newTable, boolean rehash) {        int newCapacity = newTable.length;        for (Entry<K,V> e : table) {            while(null != e) {                Entry<K,V> next = e.next;   ------(1)                if (rehash) {                    e.hash = null == e.key ? 0 : hash(e.key);                }                int i = indexFor(e.hash, newCapacity);                e.next = newTable[i];                newTable[i] = e;                e = next;            }        }    }

我在上面的程序中标记了一个(1),待会会用到,首先假设HashMap中的结构是这样的:

hashMap扩容时应该注意的死循环问题有哪些  

那么线程A如果执行到(1)的位置,那么e为节点5,next为节点6,这个时候线程B开始运行,在自己的扩容数组里面运行:

e.next = newTable[i];newTable[i] = e;

这个时候结构图: 

hashMap扩容时应该注意的死循环问题有哪些 

然后e=next; 
在进入循环执行:

e.next = newTable[i];newTable[i] = e;

这个时候结构为: 

hashMap扩容时应该注意的死循环问题有哪些

然后线程B执行完毕。线程A开始从(1)后面继续执行,这个时候也是先执行

e.next = newTable[i];newTable[i] = e;

hashMap扩容时应该注意的死循环问题有哪些 

然后e=next;这个时候e是节点6,然后再进入循环,执行上面两行程序后的结构如下: 

hashMap扩容时应该注意的死循环问题有哪些

但是这个时候由于6的next是有值的,是节点5,所以再执行e=next;的时候,e不为空,还会进入一次循环,在执行将节点插入头部的操作,所以这个时候的结构图:

hashMap扩容时应该注意的死循环问题有哪些

可以,看到已经成为了环状链表,当执行get操作的时候就会产生死循环。 

以上是“hashMap扩容时应该注意的死循环问题有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: hashMap扩容时应该注意的死循环问题有哪些

本文链接: https://www.lsjlt.com/news/279884.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • hashMap扩容时应该注意的死循环问题有哪些
    小编给大家分享一下hashMap扩容时应该注意的死循环问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!hashMap死循环原因: jdk1.7时使用头插入...
    99+
    2023-06-15
  • hashMap扩容时应该注意这些死循环问题
    hashMap死循环 1.原因: jdk1.7时使用头插入法 ,1.8之后改成了尾插入法解决了这个问题 HashMap死循环问题图解 在HashMap的数组真实长度达到阈值...
    99+
    2022-11-12
  • java swt应该注意的问题有哪些
    这篇文章主要讲解了“java swt应该注意的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java swt应该注意的问题有哪些”吧!InstallAnywhere 要注...
    99+
    2023-06-03
  • Java Thread应该注意的问题有哪些
    这篇文章给大家介绍Java Thread应该注意的问题有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java Thread应该注意的问题(wang hailong)XML:namespace prefix = o...
    99+
    2023-06-03
  • 使用FlexaddChild()方法时应该注意的问题有哪些
    小编给大家分享一下使用FlexaddChild()方法时应该注意的问题有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!FlexaddChild()方法注意事项在FlexApplication里,是不能直接用Flexad...
    99+
    2023-06-17
  • 制作404错误页面时有哪些应该注意的问题
    这篇文章主要介绍“制作404错误页面时有哪些应该注意的问题”,在日常操作中,相信很多人在制作404错误页面时有哪些应该注意的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”制作404错误页面时有哪些应该注意...
    99+
    2023-06-08
  • 制作404错误页面时应该注意的问题有哪些
    本篇文章为大家展示了制作404错误页面时应该注意的问题有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在做网站优化时我们要学会利用错误页面,例如我们网站可能出现的404错误页面,下面就给大家讲一...
    99+
    2023-06-10
  • MySQL中关于主从同步时应该注意的问题有哪些
    MySQL中关于主从同步时应该注意的问题有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在我门准备好了两台数据库服务器的基础上1、须在主、...
    99+
    2022-10-18
  • 使用JSON格式处理数据时应该注意的问题有哪些
    小编给大家分享一下使用JSON格式处理数据时应该注意的问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!根据项目的需要,我...
    99+
    2022-10-19
  • 租用香港高防服务器时应该注意的问题有哪些
    租用香港高防服务器时应该注意的问题:1.香港高防服务器的速度与稳定性。2.香港高防服务器商的售后服务质量。3.香港高防服务器商的资质情况。具体内容如下:一、速度是您选择香港高防服务器租用商的基础。没有速度的香港高防服务器是垃圾香港高防服务器...
    99+
    2022-10-23
  • DIV高度自适应以及应该注意的问题有哪些
    本篇文章给大家分享的是有关DIV高度自适应以及应该注意的问题有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。和大家重点讨论一下DIV高度自...
    99+
    2022-10-19
  • 美国服务器托管应该注意的问题有哪些
    美国服务器托管应该注意的问题有:1、需要选择信誉高、安全可靠的品牌机房服务商进行托管,保障服务器能够不间断正常运行;2、需要根据用户群体的所在区域选择较近的机房进行服务器托管,从而保障用户能够流畅的访问网站业务;3、需要理性的看待美国服务器...
    99+
    2022-10-16
  • 选择日本云服务器应该注意的问题有哪些
    选择日本云服务器应该注意的问题有:1、注意提供日本云服务器的服务商是否具备IDC、ICP、ISP三证及云服务器牌照;2注意日本云服务器的机房实力是否较强;3、注意日本云服务器的售后服务是否提供全天候24*7小时的技术支持服务;4、注意日本云...
    99+
    2022-10-12
  • 分布式系统中的数据类型应该如何选择,有哪些需要注意的问题?
    随着互联网技术的不断发展,分布式系统在现代应用中扮演着越来越重要的角色。分布式系统涉及到的数据类型也越来越多,如何选择合适的数据类型是分布式系统设计的重要组成部分。本文将介绍一些常见的数据类型,并讨论在分布式系统中选择数据类型时需要注意的...
    99+
    2023-07-28
    数据类型 分布式 关键字
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作