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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 流水线设计技术为什么能提高数字系统的工作频率_自动化流水线设计方案

    流水线设计技术为什么能提高数字系统的工作频率_自动化流水线设计方案1、什么是流水线流水线设计就是将组合逻辑系统地分割,并在各个部分(分级)之间插入寄存器,并暂存中间数据的方法。目的是将一个大操作分解成若干的小操作,每一步小操作的时间较小,所以能提高频率,各小操作能并行执行,所以能提高数据吞吐率(提高处理速度)。%k$y0q5D/G*^

    2022年8月14日
    10
  • Ubuntu20.04安装cuda10.1「建议收藏」

    Ubuntu20.04安装cuda10.1「建议收藏」安装前准备首先要查看你的NVIDIA显卡驱动是否支持cuda10.1版本。在终端执行以下命令:nvidia-smi如果**CUDAVersion:…**这里的版本号大于等于10.1(我这里的是10.2),就可以安装cuda10.1.关键点:gcc降级因为Ubuntu20.04自带的gcc版本为9.3,而cuda10.1不支持gcc-9,因此要手动安装gcc-7,命令如下:sudoapt-getinstallgcc-7g++-7安装完gcc-7,系统中就存在两个版本

    2025年11月22日
    5
  • YUV格式到底是什么?

    YUV格式到底是什么?简介YUV是视频、图片、相机等应用中使用的一类图像格式,实际上是所有“YUV”像素格式共有的颜色空间的名称。与RGB格式(红-绿-蓝)不同,YUV是用一个称为Y(相当于灰度)的“亮度”分量和两个“色度”分量表示,分别称为U(蓝色投影)和V(红色投影),由此得名。YUV也可以称为YCbCr,虽然这些术语意味着略有不同,但它们往往会混淆并可互换使用。Y表示亮度分量:如果只显示Y的话,…

    2022年7月16日
    26
  • shiro框架的基本理解[通俗易懂]

    shiro框架的基本理解[通俗易懂]1.简介shiro是一个安全框架,可以进行认证、授权、密码加密、会话管理从外部来解析shiro框架:Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManage

    2025年8月29日
    8
  • 腾讯云免费ssl证书有几个_腾讯云ssl

    腾讯云免费ssl证书有几个_腾讯云ssl腾讯云免费SSL证书腾讯云免费证书是由亚洲诚信(TrustAsia)提供的,由Digicert根证书签发。域名类型单域名,证书有效期为1年。限制同一主域最多只能申请20张。一级域名及其子域名均属于同一主域。如果超过此限制可以到其他平台申请免费的证书。如果需要免费的泛域名证书或多域名证书,可以了解一下来此加密。来此加密:提供免费的泛域名证书,多域名证书,可自动验证,自动续签。SDSDS腾讯云免费SSL证书限制…

    2025年10月16日
    4
  • matlab pca分析(二次进化攻略)

    主成分分析主成分分析法(PCA)是一种高效处理多维数据的多元统计分析方法,将主成分分析用于多指标(变量)的综合评价较为普遍。该方法的基本思想是运用较少的变量去解释原始数据中的大部分变异,通过对原始数据相关矩阵内部结构关系的分析和计算,产生一系列互不相关的新变量。根据需要从中选取比原始变量个数少的几个新变量,这些新的变量就是所谓的主成分,它们能够充分解释原始数据的变化。因此,主成分分析法本质上是…

    2022年4月11日
    45

发表回复

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

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