为什么说hashmap是线程不安全的_map线程不安全

为什么说hashmap是线程不安全的_map线程不安全 hashMap线程不安全的原因及表现hashMap出现线程不安全的原因:HashMap的实现里没有锁的机制,因此它是线程不安全的。其实只要有锁的机制,可以通过锁实现线程安全,我们在读写HashMap对象的时候加锁,以保障这个对象的线程安全,但不代表HashMap本身是线程安全的,因为是外力(你自己加的锁)使然。为啥不在HashMap内部加锁让它变成线程安全?这…

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

Jetbrains全系列IDE稳定放心使用

hashMap出现线程不安全的原因:

HashMap的实现里没有锁的机制,因此它是线程不安全的。

其实只要有锁的机制,可以通过锁实现线程安全,我们在读写HashMap对象的时候加锁,以保障这个对象的线程安全,但不代表HashMap本身是线程安全的,因为是外力(你自己加的锁)使然。

为啥不在HashMap内部加锁让它变成线程安全?
这样会增加单线程访问的资源消耗,即使没有多线程访问,也要每次检查、加锁、解锁。
实际上有线程安全的Map,Collections里面有个静态方法可以返回一个线程安全版本的HashMap

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {

return new SynchronizedMap<K,V>(m);
}

另外java5之后还提供了ConcurrentHashMap类,提供更高效的线程安全操作。

hashMap出现线程不安全的表现:
表现1:

多个线程同时操作一个hashmap就可能出现不安全的情况:

比如A B两个线程(A线程获数据 B线程存数据) 同时操作myHashMap

1.B线程执行存放数据

modelHashMap.put(“1″,”2”);

2.A线程执行get获取数据

modelHashMap.get(“1”)

A线程获取的值本来应该是2,但是如果A线程在刚到达获取的动作还没执行的时候,

线程执行的机会又跳到线程B,此时线程B又对modelHashMap赋值 如:modelHashMap.put(“1″,”3”);

然后线程虚拟机又执行线程A,A取到的值为3,这样map中第一个存放的值 就会丢失。。。。。

要保证值的准确,就要保证操作的原子性,就是保证A操作从头开始不能被打断。。所有要用同步关键字,或者使用java 1.5中的current新包中的ConcurrentHashMap,这是线程安全的,在java最新的并发包中,对之前非线程安全的工具,如hashMap List 都做了同步封转。

表现2:

一般我们声明HashMap时,使用的都是默认的构造方法:HashMap<K,V>,看了代码你会发现,它还有其它的构造方法:HashMap(int initialCapacity, float loadFactor),其中参数initialCapacity为初始容量,loadFactor为加载因子,而之前我们看到的threshold = (int)(capacity * loadFactor); 如果在默认情况下,一个HashMap的容量为16,加载因子为0.75,那么阀值就是12,所以在往HashMap中put的值到达12时,它将自动扩容两倍,如果两个线程同时遇到HashMap的大小达到12的倍数时,就很有可能会出现在将oldTable转移到newTable的过程中遇到问题,从而导致最终的HashMap的值存储异常。

表现3:

构造entry<K,V>单链表时,也会出现不安全的情况。

原文: https://blog.csdn.net/VIP_WangSai/article/details/70182933

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据分析法、数据分析方法论总结

    数据分析法、数据分析方法论总结数据分析方法论1、5W2H分析法2、PEST分析法3、逻辑树分析法4、4P营销理论5、用户使用行为理论数据分析法数据分析方法论主要用来指导数据分析师进行一次完整的数据分析,它更多的是指数据分析思路,比如从哪几方面开展数据分析,各方面包含什么内容和指标。 数据分析方法论主要从宏观角度指导如何进行数据分析,它就像一个数据分析前期的规划,指导着后期数据分析工作的开展。 数据分析法则是指具体的分析方法,如常见的对比分析、交叉分析、相关分析、回归分析、聚类分析等数据分析法。数据分析法.

    2022年5月9日
    43
  • PCIe卡的主要引脚 及 热插拔

    PCIe卡的主要引脚 及 热插拔目录1PCIe总线使用的信号1.1收发数据信号1.2辅助信号2热插拔参考资料1PCIe总线使用的信号PCIex1,x4,x8,x16卡的连接器引脚如下图所示,数据收发引脚为白色,辅助引脚为灰色:mechanicalkey对应防呆缺口的位置。1.1收发数据信号PCIe总线的层次分层图:与收发数据相关的线就是每个通路(lane)的两对差分传输线。PCIex1,x2,x4,x8,x16分别代表有1,2,4,8,16条lane。1.2辅助信号在连接器上提供辅助引脚来辅助

    2022年5月7日
    487
  • css 100% 和 100vh区别

    css 100% 和 100vh区别100%是相对于父元素100vh是相对于window

    2022年6月6日
    150
  • Git详细教程(五):查看分支、创建分支、合并分支

    Git详细教程(五):查看分支、创建分支、合并分支一、查看分支查看的git命令如下:gitbranch:列出本地已经存在的分支,并且当前分支会用*标记gitbranch-r:查看远程版本库的分支列表gitbranch-a:查看所有分支列表(包括本地和远程,remotes/开头的表示远程分支)gitbranch-v查看一个分支的最后一次提交gitbranch–merged查看哪些分支已经合并到当前分支gitbranch–no-merged查看所有未合并工作的分支1、查看远程分支gitbr.

    2022年8月22日
    42
  • Hybrid App 和 React Native 开发那点事

    Hybrid App 和 React Native 开发那点事简介:HybridApp(混合模式移动应用)开发是指介于Web-app、Native-App这两者之间的一种开发模式,兼具「NativeApp良好用户交互体验的优势」和「WebApp跨平台开发的优势」。很多人都知道,ReactNative是Facebook开源的框架,可以直接用Javascript开发原生的APP,本文则会围绕开发中的具体实践问题进行讨论。

    2025年6月21日
    0
  • 反三角函数求解matlab,关於反三角函数atan2的使用 使用Matlab计算反三角函数atan2…[通俗易懂]

    三角函数中atan2是如何计算的atan2(y,x)返回的是弧度值,两者如果相同则是0.785……,既45度我想问的atan2(y,x)是表示X-Y平面上所对应的(x,y)坐标的角度,它的值域范围是(-π,π)用数学表示就是:atan2(y,x)=arg(y/x)-π当y0时,其值为正.当两者相同时,即y=x,则其角度就是π/4,即45度。使用Matlab计算反三角函数atan2各位好…

    2022年4月7日
    120

发表回复

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

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