找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1456|回复: 0

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

[复制链接]

该用户从未签到

发表于 2020-7-5 16:51:38 | 显示全部楼层 |阅读模式

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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版权协议,转载请附上原文出处链接及本声明。
原文链接:http://blog.csdn.net/weixin_44019182/article/details/107103854
回复

使用道具 举报

网站地图|页面地图|Archiver|手机版|小黑屋|找资源 |网站地图

GMT+8, 2025-5-16 22:08

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表