为什么说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)
上一篇 2022年10月9日 下午9:36
下一篇 2022年10月9日 下午9:46


相关推荐

  • int 和bigint差别有多大?

    int 和bigint差别有多大?

    2021年10月27日
    86
  • Python连接MYSQL数据库的两种方式

    Python连接MYSQL数据库的两种方式1 常规连接 pymysql pandasimport mysql connect host 数据库地址 port 端口号 user 用户名 passwd 密码 db 数据库名称 charset utf8mb4 mycursor con cursor print 连接成功 查询 sql select from 数据库表名 where 字段名 xxand re

    2026年3月17日
    2
  • Python 学习笔记 列表 range() xxx XXX

    Python 学习笔记 列表 range() xxx XXXPython学习笔记列表range()xxxXXXprint(“-“*30)forvalueinrange(1,5): print(value)numbers=list(range(1,6))print(numbers)even_numbers=list(range(2,11,2))print(even_numbers)squares=[]forvalueinr…

    2022年8月22日
    10
  • (二)马尔可夫决策过程

    (二)马尔可夫决策过程从第一章中了解到强化学习中 智能体通过和环境进行交互获得信息 这个交互过程可以通过马尔可夫决策过程来表示 所以了解一下什么是 MDP 至关重要 不过在了解马尔可夫决策过程之前 先要一些预备知识 它们分别叫马尔可夫性质 马尔可夫过程 马尔可夫链 马尔可夫奖励过程 马尔可夫性质 Markovproper 如果一个状态的下一个状态只取决于当前状态 跟它当前状态之前的状态都没有关系 换句话说 未来的转移跟过去是独立的 只取决于现在 给定一个状态的历史概念 其实就是过去状态的一个集合表示

    2026年3月18日
    2
  • 个人微信api接口调用代码[通俗易懂]

    个人微信api接口调用代码[通俗易懂]个人微信api接口1、微信好友收发消息/***给微信好友发消息*@authorwechatno:tangjinjinwx*@bloghttp://www.wlkankan.cn*/@AsyncpublicvoidhandleMsg(ChannelHandlerContextctx,TransportMessagevo,StringcontentJsonStr){try{…

    2022年10月2日
    4
  • intellij idea 2022.01激活码【2022.01最新】

    (intellij idea 2022.01激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月1日
    199

发表回复

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

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