HashMap死循环问题大讲解(图解) 您所在的位置:网站首页 hashmap头插法原因 HashMap死循环问题大讲解(图解)

HashMap死循环问题大讲解(图解)

2024-07-10 01:01| 来源: 网络整理| 查看: 265

HashMap死循环问题是JDK1.7之前存在问题,主要源于HashMap的自身的工作机制和并发处理导致的问题,而对于JDK1.8后,官方就彻底解决了这个问题,对于死循环问题,我们首先了解一下HashMap数据插入原理

 HashMap数据插入原理——头插法

        在Java的HashMap中,put()操作采用的是“头插法”,也就是把新元素插入到链表头部。如有相同的key值插入,会覆盖旧元素。如果新元素的key值在HashMap中不存在,则会新建一个节点并放在链表头部。如果此时桶(bucket)数组中对应位置已经有了元素,那么新插入的元素会作为该元素的前驱。

 

导致死循环的原因   阶段一:

        多线程下多个线程同时在扩容临界点进行插入操作,同时开始进行扩容

         阶段二:

        多个线程同时进行扩容,扩容前首先需要获取结尾元素的下一个节点信息,以便使用头插法进行扩容。然后有部分线程时间片用完,在获取节点信息后就就行休眠了,还没开始进行头插扩容。有部分线程直接进行扩容操作,在扩容操作过程种的节点结构重组消息休眠线程不知道。

阶段三:

        第二阶段进行扩容操作后,节点结构重组后,休眠的线程拿着旧的节点消息进行二次头插,致使死循环

HashMap死循环解决方案: 

1.使用线程安全的ConcurrentHashMap替代HashMap,推荐

2.使用线程安全的容器Hashtable替代,性能低,不建议

3.使用synchronized或Lock加锁,会影响性能,不建议 

 总结:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有