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


相关推荐

  • 2020爱分析·智能通讯云厂商全景报告[通俗易懂]

    2020爱分析·智能通讯云厂商全景报告[通俗易懂]报告摘要企业面临业务增长的压力,通讯能力建设成为对内提升运营效率,对外提升产品竞争力和客户体验的重要手段,通讯云的场景应用正在加速渗透。基于对国内各行业甲方企业的调研,爱分析认为智能通讯云应用呈现以下趋势:•在提高内部运营效率方面,企业需要通过强化统一通讯能力,及提高办公智能化的方式实现;•对于企业的客服部门或呼叫中心而言,跑马圈地的时代已经过去,随着企业营销与服务渠道多元化,重心在促进营销转化与提升客户体验;•针对各行业的不同业务场景,通讯能力不仅是音视频交互工具的基础,还需..

    2022年5月18日
  • mysql倒序截取字符串_MySQL数据库之mysql截取字符串与reverse函数

    mysql倒序截取字符串_MySQL数据库之mysql截取字符串与reverse函数本文主要向大家介绍了MySQL数据库之mysql截取字符串与reverse函数,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。这个网页上很多知识点,可以学习下,关于mysql的函数,也可以作为API查询:这里只说下mysql的截取函数和reverse函数:MySQL字符串截取函数:left(),right(),substring(),substring_index()…

    2022年10月31日
  • nginx面试常见问题_面试官应该问哪些问题

    nginx面试常见问题_面试官应该问哪些问题1.什么是Nginx?Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器目前使用的最多的web服务器或者代理服务器,像淘宝、新浪、网易、迅雷等都在使用2.为什么要用Nginx?优点:*跨平台、配置简单*非阻塞、高并发连接:处理2-3万并发连接数,官方…

    2022年8月27日
  • 杂记-匆匆北京行

    杂记-匆匆北京行

    2021年7月22日
  • 联想笔记本电脑键盘灯在哪里开_笔记本电脑键盘字母键变成数字键

    联想笔记本电脑键盘灯在哪里开_笔记本电脑键盘字母键变成数字键在联想系列的笔记本电脑中,自带有键盘等的功能,不仅可以显得炫酷,还可以在光线比较暗的情况下打开键盘灯可以方便我们看清键盘上的按键,不过很多用户并不知道联想的键盘灯怎么开吧,其实有快捷键可以快速开启的,下面就给大家分享一下联想笔记本键盘亮灯按哪个键吧。具体步骤如下:1、联想笔记本部分型号具bai备键盘背光功能,方法通du过“FN+空格”打开,支持此功能的zhi机型,dao键盘上有相应标示。部分早期的…

    2022年9月20日
  • centos系统安装git

    centos系统安装gitcentos安装git

    2022年11月1日

发表回复

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

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