程序员■Java程序员必知:HashMap进行put操作会不会引起死循


程序员■Java程序员必知:HashMap进行put操作会不会引起死循
HashMap进行put操作会引起死循环?
最近在磕《java并发编程艺术》 , 在看到第六章的时候出现了下面这段我不是很理解的东西 , 如下

《java并发编程艺术》截取
    为什么要使用ConcurrentHashMap
        在并发编程中使用HashMap可能导致程序死循环 。 而使用线程安全的HashTable效率又非常低下 , 基于以上两个原因 , 便有了ConcurrentHashMap的登场机会 。

    1. 线程不安全的HashMap
        在多线程环境下 , 使用HashMap进行put操作会引起死循环 , 导致CPU利用率接近100% , 所以在并发情况下不能使用HashMap 。 例如 , 执行以下代码会引起死循环 。
HashMap在并发执行put操作时会引起死循环 , 是因为多线程会导致HashMap的Entry链表形成环形数据结构 , 一旦形成环形数据结构 , Entry的next节点永远不为空 , 就会产生死循环获取Entry 。
结论
   1. JDK1.8之前 , 为了提高rehash的速度 , 冲突链表是使用头插法 , 因为头插法是操作速度最快的 , 找到数组位置就直接找到插入位置了 , 头插法在多线程下回引起死循环
    2.JDK1.8之后开始加入红黑树 , 当链表长度大于8时链表就会转换成红黑树 , 这样就大大提高了在冲突链表查找的速度 , 同时因为链表的长度不可能大于8 , 链表在rehash的消耗就小很多 , 所以JDK1.8使用尾插法也避免了死循环问题
————————————————
版权声明:本文为CSDN博主「眯着小眼睛看着大世界」的原创文章 , 遵循CC 4.0 BY-SA版权协议 , 转载请附上原文出处链接及本声明 。

【程序员■Java程序员必知:HashMap进行put操作会不会引起死循】原文链接:https://blog.csdn.net/weixin_44019182/article/details/107103854