网易首页 > 网易号 > 正文 申请入驻

为什么HashMap非线程安全

0
分享至

上篇《HashMap底层数据结构原理》我们介绍了HashMap的底层实现方式。其中我们说HashMap是非线程安全的,那么这篇我们就来详细解释为什么HashMap是非线程安全的。

小明:老师,上次讲了HashMap的底层实现原理,学到很多东西。但是HashMap为什么非线程安全呢,一直想不明白。可以给讲讲吗?

老师:好吧,在分析高并发场景之前,我们需要先搞清楚[ReHash]这个概念。

小明:Rehash?那是什么东东?

老师:Rehash是HashMap在扩容时候的一个步骤。

HashMap的容量是有限的。当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突的几率会逐渐提高。这时候,HashMap需要扩展它的长度,也就是进行Resize。

影响发生Resize的因素有两个:

1.Capacity

HashMap的当前长度。上一期曾经说过,HashMap的长度是2的幂。

2.LoadFactor

HashMap负载因子,默认值为0.75f。

衡量HashMap是否进行Resize的条件如下:

HashMap.Size >= Capacity * LoadFactor

小明:HashMap的Resize方法,具体做了什么事情呢?

老师:HashMap的Resize不是简单的把长度扩大,而是经过下面两个步骤:

1.扩容

创建一个新的Entry空数组,长度是原数组的2倍。

2.ReHash

遍历原Entry数组,把所有的Entry重新Hash到新数组。为什么要重新Hash呢?因为长度扩大以后,Hash的规则也随之改变。

让我们回顾一下Hash公式:

index = HashCode(Key) & (Length - 1

当原数组长度为8时,Hash运算是和111B做与运算;新数组长度为16,Hash运算是和1111B做与运算。Hash结果显然不同。

Resize前的HashMap

Resize后的HashMap

ReHash的Java代码如下:

小明:明白了,HashMap真是个完美的设计呢!

老师:并不是。刚才的流程在单线程下执行并没有问题,可惜HashMap并非线程安全的。下面我来演示一下,在多线程环境中,HashMap的Rehash操作可能带来什么样的问题。

注意:下面的内容十分烧脑,请小伙伴们坐稳扶好。

假设一个HashMap已经到了Resize的临界点。此时有两个线程A和B,在同一时刻对HashMap进行Put操作:

此时达到Resize条件,两个线程各自进行Rezie的第一步,也就是扩容:

这时候,两个线程都走到了ReHash的步骤。让我们回顾一下ReHash的代码:

假如此时线程B遍历到Entry3对象,刚执行完红框里的这行代码,线程就被挂起。对于线程B来说:

e = Entry3

next = Entry2

这时候线程A畅通无阻地进行着Rehash,当ReHash完成后,结果如下(图中的e和next,代表线程B的两个引用):

直到这一步,看起来没什么毛病。接下来线程B恢复,继续执行属于它自己的ReHash。线程B刚才的状态是:

e = Entry3

next = Entry2

当执行到上面这一行时,显然 i = 3,因为刚才线程A对于Entry3的hash结果也是3。

我们继续执行到这两行,Entry3放入了线程B的数组下标为3的位置,并且e指向了Entry2。此时e和next的指向如下:

e = Entry2

next = Entry2

整体情况如图所示:

接着是新一轮循环,又执行到红框内的代码行:

e = Entry2

next = Entry3

整体情况如图所示:

接下来执行下面的三行,用头插法把Entry2插入到了线程B的数组的头结点:

整体情况如图所示:

第三次循环开始,又执行到红框的代码:

e = Entry3

next = Entry3.next = null

最后一步,当我们执行下面这一行的时候,见证奇迹的时刻来临了:

newTable[i] = Entry2

e = Entry3

Entry2.next = Entry3

Entry3.next = Entry2

链表出现了环形!

整体情况如图所示:

此时,问题还没有直接产生。当调用Get查找一个不存在的Key,而这个Key的Hash结果恰好等于3的时候,由于位置3带有环形链表,所以程序将会进入死循环!

小明:好绕啊,脑子都快缺氧了。。。

老师:这一块确实非常绕,多看几遍慢慢理解。

小明:那么,如何杜绝这种情况的产生呢?

老师:有许多方法。在高并发场景下,我们通常采用另一个集合类ConcurrentHashMap。这个集合类兼顾了线程安全和性能。下面我们来总结一下今天的内容:

1.Hashmap在插入元素过多的时候需要进行Resize,Resize的条件是

HashMap.Size >= Capacity * LoadFactor

2.Hashmap的Resize包含扩容和ReHash两个步骤,ReHash在并发的情况下可能会形成链表环。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
换帅换核心!山西官宣潘江下课,顶薪射手升级,引援准备有大动作

换帅换核心!山西官宣潘江下课,顶薪射手升级,引援准备有大动作

金风说
2026-06-29 00:05:43
一届最水的世界杯小组赛结束了

一届最水的世界杯小组赛结束了

低调看天下
2026-06-28 13:05:34
2026年,国有银行正式员工或将迎来一波离职潮!

2026年,国有银行正式员工或将迎来一波离职潮!

小陆搞笑日常
2026-06-29 00:20:36
大码模特现实里到底多大?

大码模特现实里到底多大?

飛娱日记
2026-05-12 08:27:55
神秘的华莱士分界线:只有35公里宽,却分开了两个动物世界

神秘的华莱士分界线:只有35公里宽,却分开了两个动物世界

观察宇宙
2026-06-27 10:38:09
史上最强韩国惨淡出局!名宿车范根感慨:已经很难追上日本

史上最强韩国惨淡出局!名宿车范根感慨:已经很难追上日本

球事百科吖
2026-06-28 14:46:18
内卷彻底失控!广东超41万考生过本科线,大家扎堆不愿出省。

内卷彻底失控!广东超41万考生过本科线,大家扎堆不愿出省。

放开他让wo来
2026-06-27 23:00:29
温州老板砸400万送独女留美,23岁的女儿被认识三周的男人杀死

温州老板砸400万送独女留美,23岁的女儿被认识三周的男人杀死

贱议你读史
2026-06-26 15:39:21
桔小花App贷款返利,一次性还清却遭催收,查征信才知背了数十笔贷款;辽宁营口市委市政府成立专班处理

桔小花App贷款返利,一次性还清却遭催收,查征信才知背了数十笔贷款;辽宁营口市委市政府成立专班处理

大风新闻
2026-06-28 20:23:04
不到24小时,韩红再迎噩耗,官媒发文锐评,大批网友关闭月捐

不到24小时,韩红再迎噩耗,官媒发文锐评,大批网友关闭月捐

小鋭有话说
2026-06-26 15:22:43
那些年KTV里花钱如流水的“有钱大哥”,最后结局都怎么样?

那些年KTV里花钱如流水的“有钱大哥”,最后结局都怎么样?

沈理职谈
2026-06-24 17:52:13
江西男子1人硬遛6小时,钓获162斤巨青,扣出巴掌大青鱼石!

江西男子1人硬遛6小时,钓获162斤巨青,扣出巴掌大青鱼石!

狸猫之一的动物圈
2026-06-25 10:45:38
《爱情岛》女星自曝热衷69姿势,小屋众人面前亲密行为惹争议

《爱情岛》女星自曝热衷69姿势,小屋众人面前亲密行为惹争议

浅遇时光
2026-06-27 01:07:05
河南省委书记看望王妙丽

河南省委书记看望王妙丽

政知新媒体
2026-06-27 21:56:14
突然,热门赛道遭抛售!华尔街,重大警告

突然,热门赛道遭抛售!华尔街,重大警告

证券时报
2026-06-28 23:40:06
Sidery:鹈鹕正在兜售普尔价值3400万美元的到期合同

Sidery:鹈鹕正在兜售普尔价值3400万美元的到期合同

北青网-北京青年报
2026-06-28 20:06:08
伊朗要变天了!穆杰塔巴可能已失去所有权力,三分天下格局形成?

伊朗要变天了!穆杰塔巴可能已失去所有权力,三分天下格局形成?

惊视
2026-06-26 05:59:36
国米牺牲速度只求性价比:两笔交易放缓 两名豪门级新援再出传闻

国米牺牲速度只求性价比:两笔交易放缓 两名豪门级新援再出传闻

国际足球冷雪
2026-06-28 09:19:10
2020年克林顿坦言出轨原因,莱温斯基:拉开裤链后他要用雪茄助兴

2020年克林顿坦言出轨原因,莱温斯基:拉开裤链后他要用雪茄助兴

万国明信片
2026-06-28 18:07:20
尿毒症是喝出来的?医生直言:即使是铁打的肾,这类水也要少喝

尿毒症是喝出来的?医生直言:即使是铁打的肾,这类水也要少喝

健康科普365
2026-06-24 21:20:03
2026-06-29 01:32:49
非常美丽的句子12138
非常美丽的句子12138
每天分享有趣的视频
6063文章数 10255关注度
往期回顾 全部

科技要闻

DeepSeek最新论文:如何让大模型跑得更快

头条要闻

正式测定:四川宜宾市高县发生5.5级地震

头条要闻

正式测定:四川宜宾市高县发生5.5级地震

体育要闻

两周飞5万公里!因凡蒂诺遭环保人士猛批

娱乐要闻

曾沛慈拿下《乘风2026》年度总冠军

财经要闻

省钱,我只服梁文锋

汽车要闻

搭载华为乾崑六件套 东风奕派M8预售19.98万起

态度原创

教育
艺术
亲子
公开课
军事航空

教育要闻

文科生也能学医了!多所高校放宽中医学专业选科限制

艺术要闻

她不用笔,她用刀

亲子要闻

肠道真菌菌群紊乱增加儿童过敏风险

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

特朗普又发文威胁:伊朗将不复存在

无障碍浏览 进入关怀版