前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高并发服务优化篇:一图详解1.7HashMap死循环的产生

高并发服务优化篇:一图详解1.7HashMap死循环的产生

作者头像
Coder的技术之路
发布2022-09-19 11:44:26
3520
发布2022-09-19 11:44:26
举报
文章被收录于专栏:Coder的技术之路Coder的技术之路

上篇文章详细剖析多线程下的linkedHashMap读写锁下的内存泄漏问题。不少朋友私下说这种按步骤详细剖析的方式很不错。

我给这种形式起了个响亮的名字--刨根问底儿拦不住。

并发下的线程安全问题,还有一个典型的例子就是1.7之前的HashMap,也是很多面试官喜欢问的,那么,为什么其在多线程下会出现死循环。今天我们就来一起剖析一下~

Part1JDK1.7的HashMap概述

先说一点大家都知道的。

HashMap采用数组+链表的方式进行存储。来解决hash查询和hash冲突。

随着元素的不断增多,HashMap会进行数组扩容,装填因子之类的信息我们这里就忽略了。

由于元素的hash是和数组大小有关的,因此,在扩容之后,需要重新hash,将元素移动到正确的位置上,以便hash定位。

扩容和移动的方式,是创建一个新的数组,将原始数据,根据新的hash值,用头插法插入到新的数组。最后,用新的数组代替老的数组,完成扩容。

那么,为什么多线程下,这个过程会发生死循环异常呢?

Part2剖析死循环的产生

一图胜千言,更何况是动态图~

我是动图,请给我两分钟~

结合上图,现在有<18,A> <48,B> <86,C> 三个元素被存储在table[3]的链表中。

当线程1执行到一半,正好时间片用完,此时:e = <18,A> ,next = <48,B>

再一次获取到时间片时,table引用已经是线程2处理完的结果。即newTable[19]=<86,C> -> <48,B> -> <18,A> (尾插法的结果)

这时,如果线程1再继续按原始顺序处理,将e = <18,A> ,next = <48,B> 依次插入链表头部,则变成了:

<48,B> -> <18,A> -> <86,C> -> <48,B> -> <18,A>

<18,A>.next 本来应该是Null,或者其他元素,现在变成了*<86,C>*,链表成环。

此时,如果有线程来get(19) , 而元素又在A,B,C 之外,在链表中遍历,就有可能一直循环下去。

Part3那1.8为什么不会成环

我们先看下jdk1.8下的resize源码:

一个是改用了尾部插入来保证了新链表顺序和原始链表顺序一致;另一个是改用局部变量来维护需要移动的元素,最后再把局部变量赋值给newTab,避免了直接在tab上操作导致成环。

Part4后话

不管是哪个版本的hashMap,都是线程不安全的,使用时要特别注意~

上述剖析,发现有啥问题,欢迎大家菜单栏加我微信一起交流探讨~

刨根问底儿拦不住,当在一行一行代码的探究下,把问题搞清楚时,不会有一种浑身得劲的感觉么~

推荐阅读:

3. 高并发架构优化:从BAT实际案例看消息中间件的妙用

4. 高并发存储优化:细说数据库索引原理及其优化策略

5. 高并发存储优化:许是史上最详尽分库分表文章之一

6. 高并发存储优化:数据库索引优化Explain实战

7. 高并发存储番外:阿里数据中间件源码不完全解析

8. 高并发存储优化:诸多策略,缓存为王

9. 高并发存储番外:redis套路,一网打尽

10. 高并发服务优化:浅谈数据库连接池

11. 高并发服务优化:详解RPC的一次调用过程

12. 高并发服务优化:详解一次由读写锁引起的内存泄漏

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder的技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Part1JDK1.7的HashMap概述
  • Part2剖析死循环的产生
  • Part3那1.8为什么不会成环
  • Part4后话
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档