hashmap线程安全吗 什么解决方案_hashtable为什么是线程安全

hashmap线程安全吗 什么解决方案_hashtable为什么是线程安全前言该试题从互联网获得,真实性没有考究,加上本人学识浅薄,所以面试题参考为主,解析分享为主。若对解析有不同看法,还请评论指正。谢谢。HashMap为什么不是线程安全?以JDK1.8的HashMap为例,引用作者:一字马胡所写文章中的一张图:上图为…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

HashMap为什么不是线程安全?

以JDK1.8的HashMap为例,引用作者: 一字马胡 所写文章中的一张图:
HashMap的put方法
上图为HashMap的PUT方法的详细过程.其中造成线程不安全的方法主要是resize(扩容)方法.
情况一:
假设现在有线程A 和线程B 共同对同一个HashMap进行PU操作,假设A和B插入的Key-Value中key的hashcode是相同的,这说明该键值对将会插入到Table的同一个下标的,也就是会发生哈希碰撞,此时HashMap按照平时的做法是形成一个链表(若超过八个节点则是红黑树),现在我们插入的下标为null(Table[i]==null)则进行正常的插入,此时线程A进行到了这一步正准备插入,这时候线程A堵塞,线程B获得运行时间,进行同样操作,也是Table[i]==null , 此时它直接运行完整个PUT方法,成功将元素插入. 随后线程A获得运行时间接上上面的判断继续运行,进行了Table[i]==null的插入(此时其实应该是Table[i]!=null的操作,因为前面线程B已经插入了一个元素了),这样就会直接把原来线程B插入的数据直接覆盖了,如此一来就造成了线程不安全问题.
情况二:
这种情况是resize的时候造成的.现在假设HashMap中的Table情况如下:
原Table
线程A和线程B要对同一个HashMap进行PUT操作.插入后Table变为:
插入后Table
此时,线程A和B都需要对HashMap进行扩容.
假设线程A没有堵塞过,顺利完成resize后Table如下(这里的元素位置都是假设的):
线程A
如果线程B的resize是在Entry3的时候堵塞的,那么当它再次执行的时候就会造成链表处形成一个循环链表,当进行get操作时候可能陷入死循环,原因是:
线程B获得CPU时e = Entry3 ,next = Entry 2 ;正常赋值,然后进行下一次循环遍历时要注意,此时HashMap已经被线程A resize 过得了,那么就有 e = Entry 2 , next = Entry3 ; 头插法插入此时:线程B,接着循环,e = Entry 3 ,next = Entry3.next = null (看图) ,此时再时候头插法就会形成循环链表了.循环,附上头插法代码:头插法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189531.html原文链接:https://javaforall.net

(0)
上一篇 2026年4月13日 下午1:46
下一篇 2026年4月13日 下午1:46


相关推荐

  • 软测试总结

    软测试总结

    2022年1月12日
    45
  • 移动端,PC端,微信等常用平台和浏览器判断

    移动端,PC端,微信等常用平台和浏览器判断移动端,PC端,微信等常用平台和浏览器判断

    2022年4月24日
    58
  • 倒立摆仿真_基于matlab单摆运动仿真模拟

    倒立摆仿真_基于matlab单摆运动仿真模拟本博文主要学习目的为倒立摆PID控制入门,面向matlab小白,所以挑选最简单的模型和例子写了一篇文章模型已经上传到网上,附上文件链接https://github.com/Yanchuan913/-/blob/main/Inverted_Pendulum_P.slx效果展示倒立摆PID控制matlabsimulink仿真,最简单版本效果展示,内模型的框图总框架包括物理模型部分、控制器部分、环境部分(环境部分都是这么设置的,就不多说)物理模型首先来看物理.

    2022年8月18日
    18
  • MS17010原生打法

    MS17010原生打法1、针对入口跳板机已经CS上线但是因为目标所在区域代理出来的流量卡慢、扫描会导致代理隧道崩溃、MSF的17010不成功但是原生利用工具成功的场景。此工具是由最原版调用fb.py那版提取出来的(原生版是最为稳定,并且能利用的版本)。项目地址:https://github.com/TolgaSEZER/EternalPulsemsfvenom-pwindows/x64/meterpreter/reverse_tcpLHOST=192.168.3.128LPORT=4443-fdll>x

    2022年6月14日
    65
  • 视频直播解决方案

    视频直播解决方案背景当下,视频直播行业在中国逐渐走红。在刚刚过去的2015年,视频直播成为互联网行业最抢眼的领域之一。从游戏到秀场,从传统的网页端到移动互联网,各大直播平台包括斗鱼、熊猫tv、虎牙战旗还有纯移动端的印客、易直播等,群雄割据。言归正转,毕竟本文是一篇技术博客,接下来让我们从技术的角度分析如何搭建一个自己的直播平台。流程图首先让我们看一下直播整体流程。首先是直播视频采集端,

    2022年7月24日
    11
  • freopen用法

    freopen用法在做 acm 题目的过程中 我们需要在本地机器上调试 调试过程中 如果输入数据少还可以接受 但如果输入数据很庞大的话 我们就很难忍受一次又一次的重新输入和调试了 通过 google 找到一种简便的方法 那就是 freopen 函数 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 使用 freopen 函数可以解决测试数据输入问题 避免重复输入 不失为一种简单而有效的解决方法 nbsp nbsp nbsp nbsp 下面为函数的简介 详细可参见 nbsp http www

    2026年3月3日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号