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


相关推荐

  • java volatile 关键字详解「建议收藏」

    java volatile 关键字详解「建议收藏」javavolatile关键字详解一,什么是volatile关键字,作用是什么​volatile是java虚拟机提供的轻量级同步机制​作用是:1.保证可见性2.禁止指令重排3.不保证原子性本篇具体就讲解什么叫保证了可见性,什么叫禁止指令重排,什么是原子性而在这之前需要对JMM有所了解二,什么是JMM​JMM(java内存模型JavaMemoryModel简称JMM)本身是一个抽象的概念,并不在内存中真实存在的,它描述的

    2022年7月18日
    12
  • 微信十年庆生 米聊黯然退场

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 【环球网科技综合报道】在微信庆祝 “十周岁”生日的当天,小米旗下米聊宣布彻底退出历史舞台,并关闭了服务器。 2021…

    2021年6月25日
    81
  • linux 查看网卡以及开启网卡「建议收藏」

    linux 查看网卡以及开启网卡「建议收藏」解决Error:Nosuitabledevicefound:nodevicefoundforconnection”Systemeth0″解决使用VMware克隆出来的新虚拟机无法联网的问题一.背景我们安装好了一个虚拟机,我想做分布式集群,想模拟几台服务器,这时就想直接复制已经有的安装好的虚拟机,这样比较省事,不要在重复的安装虚拟机并配置JAVA环境,省…

    2022年10月19日
    3
  • 计算机操作系统进程管理总结报告_进程的管理和控制实验报告

    计算机操作系统进程管理总结报告_进程的管理和控制实验报告计算操作系统进程管理一、进程与线程1.1、进程进程是资源分配的基本单位。进程控制块PCB(ProcessControlBlock)描述的是进程的基本信息以及进程的运行状态,我们说的创建及撤销进程都是对进程控制块PCB的操作。进程之间可以并发执行。一个程序中可以有多个进程。1.2、线程线程是独立调度的基本单位。一个进程中可以有多个线程,他们之间共享…

    2025年10月19日
    5
  • NTU NUS 申请经历

    NTU NUS 申请经历我的出国历程                ——考研+出国全纪录个人简历:本人,男,1989年出生,东北大学秦皇岛分校06级通信工程专业学生。在校期间曾获得校一等奖学金1次,二等奖学金2次,三等奖学金2次,科技创新奖学金1次,鹏远奖学金1次。曾获得校“东软杯”科技竞赛特等奖,“挑战杯”课外学术作品竞赛省三等奖,并参加过全国大学生数学建模比赛。在校期间多次获得康师傅“再来一瓶”奖励。

    2022年5月3日
    59
  • A股和B股的区别_b股是什么股票

    A股和B股的区别_b股是什么股票A股:正式名称是人民币普通股票。它是由我同境内的公司发行,供境内机构、组织或个人(不含台、港、澳投资者)以人民币认购和交易的普通股股票,我国A股股票市场经过几年快速发展,已经初具规模。.B股:正式名

    2022年8月2日
    11

发表回复

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

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