HashMap引发死链问题(HashMap、ConcurrentHashMap原理解析)

事故背景

一个CPU使用率飙升至100%的线上故障,原因是在并发情况下使用HashMap导致死循环。
当cpu使用率100%时,查看堆栈,发现程序都卡在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。

HashMap结构

HashMap 是我们经常会用到的集合类,JDK 1.7 之前底层使用了数组加链表的组合结构,如下图所示:
在这里插入图片描述

HashMap通常会用一个指针数组(假设为table[])来做分散所有的key,当一个key被加入时,会通过Hash算法通过key算出这个数组的下标i,然后就把这个<key, value>插到table[i]中,如果有两个不同的key被算在了同一个i,那么就叫冲突,又叫碰撞,这样会在table[i]上形成一个链表。

如果table[]的尺寸很小,比如只有2个,如果要放进10个keys的话,那么碰撞非常频繁,于是一个O(1)的查找算法,就变成了链表遍历,性能变成了O(n),这是Hash表的缺陷。

所以,Hash表的尺寸和容量非常的重要。一般来说,Hash表这个容器当有数据要插入时,都会检查容量有没有超过设定的thredhold,如果超过,需要增大Hash表的尺寸,但是这样一来,整个Hash表里的无素都需要被重算一遍。这叫rehash,这个成本相当的大。


JDK 1.7 HashMap的rehash源代码

Put一个Key,Value对到Hash表中:

public V put(K key, V value)
{
   
    ......
    //算Hash值
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    //如果该key已被插入,则替换掉旧的value (链接操作)
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
   
        Object k
最低0.47元/天 解锁文章
深入解析java HashMap实现原理
09-03
主要介绍了深入解析java HashMap实现原理的相关资料,需要的朋友可以参考下
Java HashMap原理及实例解析
08-25
主要介绍了Java HashMap原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
【图文并茂】讲解HashMap引发的死循环
yang553566463的博客
10-10 7328
官方介绍文档上已经明确说过了,HashMap是线程不安全的,那么为啥会线程不安全?首先是JDK1.7的HashMap上,在多线程环境下操作HashMap可能引起死循环。原因是在HashMap扩容时,链表转移后,前后链表顺序倒置(头插法导致),在转移过程中修改了原来链表中节点的引用关系,导致链表结点互相引用,即形成了环,这种情况下,当我们使用get操作获取到环形链表处的数据,就会发生死循环。在JDK1.8中,同样的前提下并不会引起这个死循环,原因是扩容转移后前后链表顺序不变,保持了之前节点的引用关系。但是即使
并发编程专题八-HashMap死循环分析
最新发布
2401_83916241的博客
04-21 901
学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。Mybatis面试专题MySQL面试专题并发编程面试专题《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
HashMap中的resize以及死链的情况
weixin_34307464的博客
09-23 374
之前我已经写过关于HashMap的内容了:http://www.cnblogs.com/wang-meng/p/7545725.html 我们都知道HashMap是线程不安全的, 如果多线程来访问会有什么问题呢? 答案是会造成死锁。 接下来我们就分析下为何会造成死锁。 说到HashMap中死锁的情况, 我们就必须要先讲下resize()方法, 顾名思义...
【Java并发处理代码规范】之避免HashMap在高并发下出现死链
wang2leee的博客
09-07 219
当使用HashMap时,在容量不够进行resize(扩容)时,由于高并发可能出现死链的情况。为了规避此风险,在开发过程中可以考虑使用其他数据结构或者加锁来解决问题
[Java]JDK1.7中HashMap的并发死链
qq_47875463的博客
12-25 1162
[Java]JDK1.7中HashMap的并发死链 HashMap的并发死链现象发生在扩容时,在扩容过程中**transfer()**方法负责把旧的键值对转移到新的表中,其代码如下: void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { while(null != e) { Entry<K,V
详述 JDK1.7 中 HashMap 会发生死链的原因
CG国斌的博客
12-01 8045
HashMap死循环是一个比较常见、比较经典的问题,在日常的面试中出现的频率比较高,所以接下来咱们通过图解的方式,带大家彻底理解死循环的原因。
多线程下hashmap死链问题
hanbingge123的博客
08-07 1057
hanss
【聊聊Java】Java中HashMap常见问题 -- 扩容、树化、死链问题
BASK2312的博客
11-04 590
其实一般正常的元素,都是不会超过阈值的,只有插入一堆重复的元素,hash值一样,才可能达到阈值,这个简称Dos攻击 而元素一旦多起来,链表查找的效率就远不及红黑树了。因为HashMap的初始容量是2的次幂,扩容之后的长度是原来的二倍,新的容量也是2的次幂,所以,元素,要么在原位置,要么在原位置。不是的,维护红黑树需要占用比链表更多的空间,而且当链表长度足够短的时候,链表查找的效率反而比红黑树更高?可以的,因为2的n次方也会有缺陷,比如给定的值全是偶数,无论如何hash之后取模,都是偶数,分布就不均匀。
Java的HashMap的工作原理是什么
01-08
hashmap是一个key-value键值对的数据结构,从结构上来讲在jdk1.8之前是用数组加链表的方式实现,jdk1.8加了红黑树,hashmap数组的默认初始长度是16,hashmap数组只允许一个key为null,允许多个value为null hashmap的...
详谈HashMapConcurrentHashMap的区别(HashMap的底层源码)
08-29
下面小编就为大家带来一篇详谈HashMapConcurrentHashMap的区别(HashMap的底层源码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
HashMap原理的深入理解
08-26
主要介绍了对HashMap原理的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
JDK 7 HashMap 并发死链
一个菜鸡的博客
07-12 235
这是为了观察 e 节点和 next 节点的状态,Thread-0 单步执行到 594 行,再 594 处再添加一个断点(条件Thread.currentThread().getName().equals("Thread-0")) 这时可以在 Variables 面板观察到 e 和 next 变量,使用 view as -> Object 查看节点状态。第二次循环,注意这时 e 是 (35,1) 并链向 (1,null) 所以 next 又是 (1,null) [1] (35,1)->(1,null)
为什么JDK1.7的HashMap会出现扩容死链
suweijie的博客
01-24 483
JDK1.7版本的HashMap在多线程的情况下扩容出现死循环(扩容死链),根本原因是:HashMap在进行扩容时需要进行数据转移,jdk1.7的版本数据转移使用的是头插法(链表的数据从头插入)。
一篇弄懂concurrenthashmap原理
weixin_54232666的博客
06-29 579
一篇弄懂concurrenthashmap原理,包含hashmap链表循环问题concurrenthashmap8和7的put、get、扩容、size、移位原理。想抗住面试concurrenthashmap拷打,这篇就够了!
面试题总结:HashMap底层原理
lt_BeiMo的博客
04-15 1224
不仅仅是一道题,之后的某一天,它可能是破局的关键。存储键值对结构、底层数据结构、红黑树和链表位运算、put、get方法的实现segment锁和桶锁、线程不安全和HashTable、ConcurrentHashMap
HashMap1.7 扩容时产生死链
qq_45839708的博客
08-07 926
HashMap1.7 扩容机制 HashMap1.7 扩容机制:当 put 一个新键值对时;发生了哈希碰撞(hash值相同)并且加上新键值对后,键值对总数达到了阈值(容量 * 0.75) ① 如:容量为 16 的HashMap,每个位置都放了一个键值对;它并不会扩容,因为没有发生哈希碰撞 ② 提问:容量为 16 的HashMap,最多可以放多少个键值对? 答:26个 在 0 号位置先加入 11 个键值对(其他位置都可以),然后将剩余空位置填满;结果为 11+15=26;假如再 put 一个新键值
HashMap死链问题
07-28
HashMap 中的死链问题指的是在使用 HashMap 进行键值对存储时,可能会出现某些键值对无法被访问到的情况。这种情况通常是由于哈希冲突导致的。 在 HashMap 中,每个键值对都会根据键的哈希值进行散列,然后存储在...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • ActiveMQ详细入门使用教程 162364
  • springmvc运行流程分析,手写spring框架尝试 119249
  • Nginx实现HTTP反向代理配置 96214
  • Nginx实现https反向代理配置 93069
  • 使用putty的pscp指令进行本地和linux服务器的文件传输 63972

分类专栏

  • 架构之路 47篇
  • JVM & JDK 51篇
  • 问题&优化归集 13篇
  • SpringBoot 24篇
  • SpringCloud 10篇
  • Dubbo 10篇
  • 算法 12篇
  • 设计模式 10篇
  • Netty 2篇
  • Redis 2篇
  • Zookeeper 3篇
  • SQL优化 5篇
  • sentry 1篇
  • Mysql 41篇
  • Oracle 54篇
  • Spring 6篇
  • SpringMvc 5篇
  • Mybatis 11篇
  • Hibernate 2篇
  • SpringData JPA 1篇
  • MQ 4篇
  • MongoDB 1篇
  • Maven 1篇
  • IntellliJ   IDEA 9篇
  • eclipse 3篇
  • log4j 3篇
  • PowerDesigner 2篇
  • 运维(部署、构建) 11篇
  • Docker 2篇
  • CXF  WebService 2篇
  • Linux 30篇
  • Jenkins 3篇
  • Nginx 11篇
  • Git 4篇
  • Echarts 1篇
  • JavaScript 7篇
  • EasyUI 3篇
  • Shiro 2篇
  • Thymeleaf 3篇
  • POI 1篇
  • 机器学习 1篇
  • Experience 9篇
  • LifeStyle 2篇
  • XStream 1篇
  • 代理 8篇

最新评论

  • IDEA的配置如何在Windows和Mac之间转换

    大门牙粉兔: 请问为什么将settings.jar导入进去后 还要导入config文件夹

  • 解决mysql出现ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES/NO)【Mac】

    weixin_42716460: 8.0版本改密码,对应命令是:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

  • 一套适用于大部分系统的优化流程

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/8025895, 请多输出高质量博客, 帮助更多的人

  • HashMap引发死链问题(HashMap、ConcurrentHashMap原理解析)

    JdbcUtils: 感谢提示

  • HashMap引发死链问题(HashMap、ConcurrentHashMap原理解析)

    kikikikikiku: jdk8的hashmap并不是通过取模的方式决定node在数组中的位置,而是通过hash&(length-1)来决定node的位置的。

大家在看

  • 夏老师小课堂(9)影响电机尺寸的因素(1)提高磁性能 383
  • VSCode创建Spring Boot项目pom.xml的配置,MAVEN的Lifecycle的执行
  • 对于脉搏检测的可视化 663
  • Vue前端平台的搭建
  • 国产操作系统上du命令详解 _ 统信 _ 麒麟 _ 中科方德

最新文章

  • ClickHouse入门及适用场景(Chat-GPT产物)
  • 4S店提车注意事项
  • arthas实用工具梳理篇
2023年1篇
2022年2篇
2021年1篇
2020年11篇
2019年24篇
2018年306篇

目录

目录

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源新开公司如何起名字周小云的幸福生活闫姓男孩起名鼠葛朗台是个什么样的人姚起名字女孩韩国sbs身上莫名起疙瘩护肤品起名猪宝贝起名字news.163.com起个游戏名字霸气点微信群起名时尚非主流图片神盾局特工下载四化衍起名字起通讯公司名字displayx姓牛宝宝起名的给姓罗的宝宝起名大全名字大全等什么君真人照片警犬卡尔4月6日是什么星座起名八字在线青岛房屋维修基金起名机器工程公司破解补丁八字缺木水怎么起名字郭德纲相声全集下载隐形狂人淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化