JDK1.7中HashMap的死循环问题及解决方案

 更新时间:2023年10月12日 09:30:18   作者:jacheut  
这篇文章主要为大家介绍了JDK1.7中HashMap的死循环问题及解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

hashMap在多线程环境下的表现

  • 在jdk1.7中多线程put时可能会导致get无限循环,具体表现为CPU使用率100%;

该方法实现的机制就是将每个链表转化到新链表,并且链表中的位置发生反转,而这在多线程情况下是很容易造成链表回路,从而发生 get() 死循环。所以只要保证建新链时还是按照原来的顺序的话就不会产生循环(JDK 8 的改进)。即在jdk1.7是采用的头插法,在jdk1.8使用了尾插法解决。

HashMap死循环只发生在JDK1.7版本中,主要原因是JDK1.7中的HashMap,在头插法 加 链表 加 多线程并发 加 扩容这几个情形累加到一起就会形成死循环。多线程环境下建议采用ConcurrentHashMap替代。

  • 多线程put时可能导致元素丢失 原因:当多个线程同时执行addEntry(hash,key ,value,i)时,如果产生哈希碰撞,导致两个线程得到同样的bucketIndex去存储,就可能会发生元素覆盖丢失的情况

Hashmap中的链表大小超过八个时会自动转化为红黑树,当删除小于六时重新变为链表,为啥呢?

根据泊松分布,在负载因子默认为0.75的时候,单个hash槽内元素个数为8的概率小于百万分之一,所以将7作为一个分水岭,等于7的时候不转换,大于等于8的时候才进行转换,小于等于6的时候就化为链表。 避免树和链表的频繁转换

从时间复杂度分析,树的查询时间复杂度是logn,所于大于等于8使用红黑树。

Collections.synchronizedMap是怎么实现线程安全的

在SynchronizedMap内部维护了一个普通对象Map,还有排斥锁mutex,如图

我们在调用这个方法的时候就需要传入一个Map,可以看到有两个构造器,如果你传入了mutex参数,则将对象排斥锁赋值为传入的对象。

如果没有,则将对象排斥锁赋值为this,即调用synchronizedMap的对象,就是上面的Map。

创建出synchronizedMap之后,再操作map的时候,就会对方法上锁。

以上就是JDK1.7中HashMap的死循环问题及解决方案的详细内容,更多关于JDK1.7 HashMap死循环解决的资料请关注脚本之家其它相关文章!

相关文章

  • Java中关于 null 的几种处理方式详解

    Java中关于 null 的几种处理方式详解

    这篇文章主要介绍了Java中关于 null 的几种处理方式,关于 null ,你应该知道下面这几件事情来有效的了解 null ,从而避免很多由 null 引起的错误,具体细节跟随小编一起学习下吧
    2021-10-10
  • java基础学习笔记之泛型

    java基础学习笔记之泛型

    所谓泛型,就是变量类型的参数化。泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。
    2016-02-02
  • IntelliJ IDEA 2021.3永久最新激活至2099年(亲测有效)

    IntelliJ IDEA 2021.3永久最新激活至2099年(亲测有效)

    最新版idea2021.3已出来,很多网友迫不及待的要升级idea2021最新版,今天小编抽空给大家整理了一篇教程关于idea2021.3最新激活教程,本文以idea2021.2.3为例通过图文并茂的形式给大家分享激活详细过程,感兴趣的朋友参考下吧
    2020-12-12
  • Mybatis中<if>和<choose>的区别及“=”判断方式

    Mybatis中<if>和<choose>的区别及“=”判断方式

    这篇文章主要介绍了Mybatis中<if>和<choose>的区别及“=”判断方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringBoot+LayIM+t-io 实现好友申请通知流程

    SpringBoot+LayIM+t-io 实现好友申请通知流程

    这篇文章主要介绍了 SpringBoot+LayIM+t-io 实现好友申请通知流程,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2017-12-12
  • Java调用pyzbar解析base64二维码过程解析

    Java调用pyzbar解析base64二维码过程解析

    这篇文章主要介绍了Java调用pyzbar解析base64二维码过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • springboot返回值转成JSONString的处理方式

    springboot返回值转成JSONString的处理方式

    这篇文章主要介绍了springboot返回值转成JSONString的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java JDK11基于嵌套的访问控制的实现

    Java JDK11基于嵌套的访问控制的实现

    这篇文章主要介绍了Java JDK11基于嵌套的访问控制的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • packages思维及使用Java添加Android平台特定实现

    packages思维及使用Java添加Android平台特定实现

    这篇文章主要为大家介绍了packages思维及使用Java添加Android平台特定实现在Flutter框架里的体现和运用详解,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java 逻辑运算符中&&与&,||与|的区别

    Java 逻辑运算符中&&与&,||与|的区别

    这篇文章主要介绍了Java中&&与&,||与|的区别的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论