hashMap产生的循环依赖问题

10 篇文章 0 订阅
订阅专栏

hashMap是线程不安全的,主要重点讲一下,线程不安全导致的循环依赖问题

假设:hashMap的数组加链表,数组初始长度为2,同时hash的计算方式为key值%2,同时等到链表长度为3的时候开始扩容,扩容方式为原始数组大小*2,此时两个线程对同一个HashMap进行操作

1.这个是初始状态,同时map里面存储的值

2.此时第一个线程开始进行操作,执行到这一步的时候cup去执行其它线程,导致该线程被挂起

 do {
  Entry<K,V> next = e.next; // <--假设线程一执行到这里就被调度挂起了,执行其他操作
  int i = indexFor(e.hash, newCapacity);
  e.next = newTable[i];
  newTable[i] = e;
  e = next;
 } while (e != null);

 此时线程1的情况,此时线程扩容然后在准备开始给节点重新分配对应的数组的时候被挂起(这个e和next不懂得可以去了解下链表,e代表当前节点,next代表当前节点中存储的下一个节点的地址)

 3.当线程1被挂起的时候线程2刚好访问该集合并且完成了扩容操作

 这里讲下为什么扩容成这样,因为链表是从第一个节点开始读的所以一开始处理的应该是key=3,然后key=3被存储到数组3的位置,然后遍历到下一个节点key=7,把7存储到数组3的位置,key=3的前面,为什么存储在前面?因为不用遍历到末尾,这样快。然后在处理key=9。

4.同时e还是线程1当前所在节点,然后next是它所指向的下一个节点,此时线程1恢复执行。

重点来了!!

第一步,线程1会把自己所在的当前节点(e-<key=3,vlue=A>)进行计算,存储到数组三的位置上去,

 第二步,会遍历到下一个节点,即 (next-<key=7,vlue=B>),同时把next指向下一个节点(提前获取地址主要是防止链表数据丢失),此时节点e变成(e<key=7,vlue=B>),而因为线程2的操作,导致e的下一个节点是(next<key=3,vlue=A>)

 第三步,此时会把e插入,同时节点向下遍历(同2)

 第四步,会把e节点插入到数组三,应为next指向的是null到尽头了,所以就不需要向下遍历了

         于是一个环形链表就形成了,因为key=7的下一个节点是指向key=3的,但是key=3的节点又指向着key=7.

        这样就是一个很经典hashMap线程不安全导致的循环依赖,因为是个循环链表,就会导致数组一直重复扩容,导致集合的一个无限大,但是JDK1.8的时候,把头插法改成了尾插法,同时引进了红黑树,当连续扩容32次的时候会转换成红黑树,解决这个循环依赖的问题,但是还是可能会引起各种线程不安全问题,所以在多线程情况下,尽量使用ConcurrentHashMap。

learning-notes:学习一些东西
04-25
learning-notes 分布式 1. Lambda表达式 Java基础 JVM 设计模式 数据库 并发 微服务 消息队列 1.RabbitMq 缓存 1.Redis集群方式(主从复制,哨兵模式和Redis-Cluster集群) 2.Redis内存回收机制 3.Redis笔记 4.Redis Cluster原理 5.Redis锁 6.Redis 分库分表 分库分表 网络 1.https原理 2.TCP与UDP MyBatis一级与二级缓存 hibernate一级与二级缓存 Spring 1.循环依赖 MySQL 1.MySQL规范 2.MySQL优化 3.MysQL主从复制 主从复制2 4.MySQL索引和查询 其他 1.NIO,BIO 2.限流 3.HashMap源码解析 4.CDN 5.多模块构建过程 6.高性能 7.高性能1 8.中间件 网络 1.CDN 其他 1.Mybatis
JavaSourceCodeAnalysis:JDK二进制阅读笔记,包括Java常用集合类和Java常用和发工具(同步工具,线程安全集合,线程池)两个部分-java source code analysis
03-25
java.util中的集合 列表,堆栈和队列 | ArrayList是基于串联实现的线性表,没有最大容量限制(实际上有,是Integer.MAX_VALUE),可扩容。LinkedList是基于串联实现的线性表(双向链表),没有最大容量限制。 LinkedList还实现了Deque接口,可以作为单向和双向实例。 堆栈继承自向量,提供基础的堆栈操作。其保障线程安全的手段是使用同步的包装所有函数,和其他线程安全的集合比起来,在多线程环境中效率很低。 ArrayDeque是基于循环拆分的双向数组,可扩容,拆分栈和样式。 平均情况下,作为栈比Stack效率更高,作为层次比LinkedList效率更高。 对于整型元素而言,最小堆。 放 | 设置中位数出现重复元素。 HashSet完全依赖HashMap(将HashMap实例作为一个属性),Map中的键用于存储元素。TreeSet则依赖Tre
java8stream源码-JPP:JPP
06-04
java8 stream 源码 JPP JPP - Java Promotion Process 是一个Java能力提升的计划,与君共勉 在这里: 你可以记录有趣的案例Demo 你可以链接有深度的博客文章 你可以分享自己的学习历程 这个计划需要你们的加入 Peace~Yo 计算机基础篇 常用工具篇 J2SE基础 JVM 虚拟机 基本框架篇 Spring篇 消息队列 缓存中间件 数据库 搜索引擎篇 文件目录中有一些分享 小工具 大数据篇 微服务、架构思维 网关 并发编程 容器篇 面试篇 算法 &LeeCode &滑动窗口 &LRU 思维导图 HashMap 图片过大可能加载不出,请自行至项目相应的文件查看 最新更新:修正HashMap1.8中变树阈值部分泊松分布的概率分布图 网络通信 操作系统层面 Redis 最新更新:Redis分布式锁细节补充 Spring Bean 声明周期 & 循环依赖 更新2021-1-27:补充生命周期AOP处理 及 singletonFactories 说明
HashMap1.8也会发生死循环—记录
m0_57781768的博客
12-09 1429
hashmap在并发执行put操作时会引起死循环,因为在put中会引起扩容操作,使链表形成环形的数据结构,不是很明白,然后在网上看了一些博客,但是博客都是jdk1.7版本的,而1.8版本中的扩容操作已经和1.7版本中大不一样了,于是自己开始研究,看源码的时候,觉得jdk1.8版本中多线程put不会在出现死循环问题了,只有可能出现数据丢失的情况,因为1.8版本中,会将原来的链表结构保存在节点e中,然后依次遍历e,根据hash&n是否等于0,分成两条支链,保存在新数组中。
Spring为什么要用的三级缓存解决循环依赖
sxl123sxl的博客
04-29 2577
Spring为什么用三级缓存解决循环依赖
HashMap在jdk1.8也会出现死循环的问题(实测)
Liu_JM的博客
04-17 7059
昨天在面试的时候,面试官问到HashMap在多线程并发的情况下怎么出现死循环的? 我当时非常有底气的回答:Hashmap在jdk1.8之前多线程同时进行put操作,并且同时进行扩容的时候可能会出现链表环,导致死循环的发生。 面试官紧接着问:那1.8就不会出现死循环了吗? 底气瞬间消失,思考一会:1.8在多线程的情况下HashMap会出现数据丢失的问题,比如…(给面试官举了个栗子)。 面试官毫无波澜...
JDK1.7HashMap 为什么会产生死循环
qq_32699791的博客
08-27 1565
JDK1.7 HashMap为什么会产生死循环 1. 大家没有想到吧,在jdk1.7中HashMap会有死循环的场景出现,当然前提的在并发的情况下,单线程操map是不会有死循环问题的,那HashMap死循环是怎么产生的呢? 先给出结论,在并发下对同一个map进行操作,当map进行扩容的时候就有可能会产生循环依赖疑问,当有调用map的get()方式的时候由于里面存在循环引用就会导致CPU一直到100%,碰到这种情况就只能服务重启了,所以现在大家的项目中一般都使用JDK1.8,有了结论下面我们来一起分析并发下
Java递归构建树形结构
qq_43842093的博客
09-05 4200
​ 本文介绍Java后台构建树形结构数据的设计思路及实现,在设计过程中,仍然存在许多未能充分理解的位置,若存在错误或更好实现方案,可分享/指出,共同学习进步。
HashMap死循环问题
qq_35181209的博客
08-16 451
转载出自于JAVA HashMap的死循环 在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写的,因为JavaHashMap是非线程安全的,所以在并发下必然出现问题。但是,我发现近几年,很多人都经历过这个事(
HashMap的循环引用
qq_42588134的博客
02-17 1026
HashMap是非线程安全类,在java7多线程扩容机制下链表变成循环链表,出现循环引用问题。 解释: 1、HashMap数据结构是 数组+链表结构。 2、扩容方式是 创建一个数组长度是原数组2倍的新数组。遍历原数组,将每个数组链表上的元素重哈希,通过头插法放入到对应的新数组位置上,遍历完后改变数组指针。 在多个线程检测到并进行扩容操作时,线程一在扩容到 准备将某个链表上的第一个元素k1移到新...
leetcode下载-JavaTopic:Java面试题总结
06-29
如何解决spring循环依赖问题? Redis篇: redis持久化的原理(RDB、AOF); redis缓存穿透、缓存雪崩,有没有在实际的工作中遇到过,如果解决缓存雪崩问题; redis的有几种集群方式; redis的基本数据类型(String、...
Spring——三级缓存解决循环依赖详解
热门推荐
共勉
11-29 1万+
结合Spring源码分析三级缓存分别是什么?在哪里产生?一张图搞清楚到底是怎么解决循环依赖的?一张图搞清楚二级缓存行不行?
牛逼!“重金求来”Alibaba技术官并发编程笔记,进阶学习资料!
m0_56710876的博客
04-20 399
前言 毫不夸张地说,JVM是现代软件工程最成功的案例之一。因为它自带GC,又有无数可以微调的参数,且运行极其稳定可靠,所以,许多厂商的核心业务系统,才敢放心地用Java编写,运行在JVM之上。 近几年深入学习JVM调优的人越来越多,因为互联网一线大厂的Java高级开发工程师JD中都明确要求了“JVM调优”的能力。JVM调优是跳槽大厂必备的技能,但是由于JVM知识体系过于庞大,非系统学习难以学透,并且即使掌握了全部理论,没有实操,依然无法应对面试! 今天,特将腾讯大佬疯狂加持的“千万级”JVM 笔记分享给你们
HashMap讲解(包括产生死循环问题的原因)
qq_41146071的博客
09-28 742
HashMap数据结构以及在多线程情况下产生死循环的原因
循环依赖解决方案之有向无环图
qq_29145405的博客
07-29 695
222任务的执行有如下依赖关系: 可以使用DAG(有向无环图)来维护这种依赖关系; 定义TASK @Data @NoArgsConstructor public class NodeTask { private String id; private Set<String> dependences = Sets.newConcurrentHashSet(); //依赖的taskID public NodeTask(String id) { ...
保姆级一条龙服务——自关联构造父子级关系(@JsonBackReference和@JsonManagedReference解决循环依赖
菜鸟琪
10-01 832
保姆级一条龙服务——自关联构造父子级关系(@JsonBackReference和@JsonManagedReference解决循环依赖) 废话篇 我这个不知名的菜鸟竟然都会被人催更(已经是五月份的事情了,一直没有兑现承诺????但是我还记得,因为受宠若惊????)。所以接下来我决定爆肝七天七夜出他个几篇精品(画个大饼先????) 终于不是菜鸟学系列了,但我还是从前那个菜鸟,没有一丝丝改变,唯一变的是逐渐减少的发量。 前几天写代码被打击到了,我用两天写出来的菜单分类功能被组里一个同事小姐姐用两个小时重新实
operator <=> (spaceship operator)
最新发布
janeqi1987的专栏
05-28 963
= 与!= 操作符为了检查是否相等,现在定义== 操作符就够了。当编译器找不到表达式的匹配声明a!=b 时,编译器会重写表达式并查找!(a==b)。若这不起作用,编译器也会尝试改变操作数的顺序,所以也会尝试!(b==a):a!=b,!(b==a)因此,对于TypeA 的a 和TypeB 的b,编译器将能够识别并编译a!= b若需要的话,可以这样做• 一个独立函数operator!• 一个独立函数operator==(TypeA, TypeB)
Spring6基础笔记
质胜文则野,文胜质则史。文质彬彬,然后君子。
05-21 1226
Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring 框架除了自己提供功能外,还提供整合其他技术和框架的能力。Spring 自诞生以来备受青睐,一直被广大开发人员作为 Java 企业级应用程序开发的首选。时至今日,Spring 俨然
jdk17hashmap死循环
08-22
确保你正确地使用了 HashMap 的方法和功能,如 put()、get() 等,并且没有出现潜在的循环依赖或逻辑错误。 4. 检查你的代码是否存在并发访问 HashMap 的情况。如果多个线程同时访问 HashMap,并且没有正确处理同步...

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

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

热门文章

  • 端口被占用, 多个端口状态为TIME_WAIT 10537
  • Oracle和MySql的布尔类型 3654
  • 为什么switch 的default后面要跟break? 3498
  • Linux(Centos8)部署DubboAdmin2.6 2722
  • 如何使用OpenSSL生成私钥与证书 2586

分类专栏

  • Linux 6篇
  • BUG异常 5篇
  • Java基础 10篇
  • 学习补充 5篇
  • sql
  • 数据库 4篇
  • Linux常用命令 1篇
  • 中间件学习 4篇
  • Demo
  • 数据结构
  • 设计模式 2篇
  • 算法 1篇
  • 前端 1篇
  • 奇思怪想 2篇
  • Student项目学习搭建 4篇

最新评论

  • war包反编译(附带软件)

    基础不牢 地动山摇: 附官网了

  • war包反编译(附带软件)

    Jackmat: 兄弟,再发一次呗

  • centos 8 部署安装JDK环境和遇见的问题

    Boy407: 看看了那么多文章你的最详细

  • centos 8 部署安装JDK环境和遇见的问题

    来自建哥的肯定: 非常的呦西

  • npm install 出错

    石臻臻的杂货铺: 奥利给!!

大家在看

  • 计算机网络 实验二 wireshark抓包 实验报告
  • Linux如何远程连接服务器?
  • Java多线程知识点
  • 西门子学习笔记7 - S7通讯
  • OCPP1.6 v2 之 ocpp-1.6 edition 2 (中文翻译)

最新文章

  • tomcat (SCI)ServletContainerInitializer 的加载原理
  • 如何使用OpenSSL生成私钥与证书
  • shell 和 批处理命令小本本
2023年4篇
2022年22篇
2021年19篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司铜陵网站优化排名报价松岗网站优化按天扣费报价萍乡百姓网标王推广多少钱眉山网站定制报价阳泉网站搜索优化多少钱云浮网站定制公司海口网页设计报价漯河网站改版价格陇南网页设计多少钱十堰阿里店铺运营报价玉溪百度爱采购坪地建设网站公司盐田网站推广价格盐城企业网站改版公司赣州网站改版公司泸州网站排名优化公司德宏百度网站优化价格淮北网络推广报价宜昌百度seo公司防城港网站建设潮州网页设计报价随州SEO按效果付费报价石岩网络推广价格观澜百度爱采购哪家好坪山设计公司网站价格塔城SEO按效果付费价格固原百度竞价包年推广哪家好河池至尊标王多少钱吉林百搜标王哪家好凉山模板推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化