hashMap线程不安全的原因及表现

一文教会你HashMap为啥线程不安全(多图VIP版) 首先思考一下,为啥 HashMap 会存在线程安全性问题? 有的人脱口而出,JDK7 的 HashMap 因为采用头插法,多线程环境下会造成死循环,JDK8 虽然改用了尾插法,但多线程环境下仍然存在丢失更新的问题,所以 HashMap 存在线程安全性问题。 一听就是老八股人了,哈哈哈。 但其实上面的答案并不全面,而且很容易误导编程的新手,让新手总以为 HashMap 只是因为死循环或者丢失更新的问题才导致的线程不安全。 HashMap 之所以存在线程安全性问题,本质上是因为 HashMap 的"增删改"操作 阅读详情
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>单链表时,也会出现不安全的情况。


【并发】为什么HashMap是线程不安全的? 目录 1.什么是线程安全性(what) 2.如何分辨一个类是否线程安全?(HOW) 3.为什么hashmap不安全 why 3.1 插入HashMap.put 3.1.1 HashMap 在扩容的时候 3.2 HashMap 在删除数据的时候 0.背景 经常会看到说HashMap是线程不安全的,ConcurrentHashMap是线程安全的等等说法,不禁有个疑问,什么是线程安全?什么样的类是线程安全的? 1.什么是线程安全性(what) 线程安全定义,最核心是正确性, 正确性:多个线程访问某个类,不管怎么调度这些线程,其代码中不需要额外的同步或协同(synchronized),这个类依然有正确 立即下载

相关推荐

我用WorkBuddy“克隆“了一个我,从此每句话像我自己说的

各位,做这件事花了多长时间?准备样本可能要半小时,提炼风格十分钟,保存固化再花十分钟。加起来不到一个小时。但这一个小时之后呢?你就拥有了一个"永远在线的文字替身"。以后写口播稿,打开WorkBuddy跟它说;写课程逐字稿,跟它说;写公众号文章,也跟它说。写出来的东西,你的学员一看——“嘿,这不就是翟猛老师说的嘛。说到这儿,可能有人会问:老师,我的风格有那么重要吗?AI写的不都挺好的吗?各位你想想看,你为什么愿意听某个老师的课?不只是因为他讲的内容好,更是因为你喜欢他讲话的方式。

weixin_39284145的博客 819

由于找不到msvcp110.dll无法继续执行代码是什么原因_HashMap为什么线程不安全

一、学习目标1、HashMap线程不安全原因:原因:JDK1.7 中,由于多线程对HashMap进行扩容,调用了HashMap#transfer(),具体原因:某个线程执行过程中,被挂起,其他线程已经完成数据迁移,等CPU资源释放后被挂起的线程重新执行之前的逻辑,数据已经被改变,造成死循环、数据丢失。JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap#putVal()...

weixin_30902415的博客 3362

RandLA-Net复现SemanticKITTI和S3DIS数据集

RandLA-Net复现KITTI和室内数据集

weixin_48845174的博客 4112

谈谈HashMap为什么是线程不安全的?

我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,应该使用ConcurrentHashMap,但是其线程不安全体现在什么地方,可能并没有深入理解,本文将对该问题进行解密。

m0_55611144的博客 1万+

DTS 数据迁移

支持关系型数据库(MySQL, Oracle, SQL Server等)、NoSQL数据库、大数据系统等。DTS数据迁移是现代化数据架构调整和云迁移过程中的重要工具,能够大大降低数据迁移的复杂度和风险。DTS (Data Transmission Service) 是一种数据迁移和同步服务,:先迁移历史数据(全量),再实时同步新增变化(增量):不同数据库类型间迁移,如Oracle到MySQL。:将单库数据迁移到分库分表架构。:将业务数据迁移到分析型数据库。:将本地数据库迁移到云数据库。

qq_41081716的博客 749

手把手搭建你的第一个OCT仿真模型:用Python和光学仿真库重现A-SCAN信号

本文详细介绍了如何使用Python和光学仿真库搭建OCT仿真模型,重现A-SCAN信号。从环境配置、干涉仪建模到信号处理全流程,手把手教你实现光学相干层析成像的核心技术。通过代码示例和性能优化技巧,帮助开发者深入理解OCT原理并应用于医疗诊断等领域。

weixin_42562079的博客 240

详解HashMap线程不安全体现在哪里?

在Java中,HashMap是一种常用的数据结构,它以键值对的形式存储和管理数据。然而,由于HashMap在多线程环境下存在线程安全问题,因此在使用时需要格外小心。简单来说:在的时候,因为采用的是头插法,所以会可能会有循环链表产生,导致数据有问题,在 1.8 版本已修复,改为了尾插法;在任意版本的 hashMap 中,如果在,可能会有数据覆盖的情况发生,导致线程不安全。

2301_76607156的博客 2201

UE5音效系统全解析:从Sound Cue到MetaSounds的实战指南

在游戏开发中,音频系统是构建沉浸式体验的关键技术之一。其核心原理在于通过数字信号处理(DSP)和空间音频渲染,模拟真实世界的听觉感知。传统音频管线通常基于静态资源播放与混合,而现代引擎则引入了程序化音频生成与动态调制技术,这极大地提升了音频的互动性与表现力,使其能够实时响应游戏状态变化。这一技术革新对于开发开放世界、VR及3A级游戏尤为重要,它能实现风吹草动皆有不同声响、音效随环境动态变化的细腻效果。本文聚焦虚幻引擎5(UE5)的音效系统,深入剖析其新旧两套核心架构:稳定高效的Sound Cue、Sound

weixin_31179927的博客 331

hashMap线程不安全的原因及表现-2

一直以来只是知道HashMap是线程不安全的,但是到底HashMap为什么线程不安全,多线程并发的时候在什么情况下可能出现问题? HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。 javadoc中关于hashmap的一段描述如下: 此实现不是同步的。如果多个

WangSai.coo的专栏 558

在Proteus中用80C51模拟4线SPI点亮OLED屏幕

在Proteus里用80C51模拟4线SPI控制OLED屏幕使其显示图案(汇编实现)。

Connor3093的博客 5003

AEJoy —— 表达式之仅限在某一维摆动【JS】

效果图 wiggle() 的作用仅限于水平方向 想法 wiggle() 确实是一个非常方便的工具,但有时您希望对它有更多的控制。在本例中,我们希望仅将摆动限制在水平方向。 设计 要理解 wiggle() 最重要的一点是,它生成的结果与应用它的属性具有相同的维度。例如,如果你将 wiggle() 应用于 3D 层的 position 属性,结果将是一个由三个元素组成的数组(x、y 和 z 各一个)。我们需要做的就是将 wiggle() 的结果捕捉到一个变量(我们称之为 “w” ),然后从这个变量中提取我们想

ShaderJoy 的兴趣技术杂货铺 2094

JAVA之ConcurrentHashMap和HashMap关于线程安全问题分析

ConcurrentHashMap之所以是线程安全的,其内部使用了CAS乐观锁+synchronized锁机制,保证多线程下的操作安全。

firstendhappy的博客 452

Vue3 + 高德地图实现车辆电子围栏监控与报警

通过本文的实现,我们完成了一个通用的车辆电子围栏监控功能:支持多种围栏类型。支持进入/离开/双向报警。使用缓存机制避免重复告警。可与Vue3 + 高德地图无缝集成。在实际项目中,可以结合WebSocket 实时定位,实现车辆的实时监控 + 围栏告警系统🚀。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 1035

多线程下的ConcurrentHashMap与线程不安全的HashMap以及效率底下的多线程HashTable实现分析

多线程下的ConcurrentHashMap与线程不安全的HashMap以及效率底下的多线程HashTable实现分析 //todo ConcurrentHashMap的代码实现结构 //todo HashMap的代码实现结构以及线程不安全的原因 //todo HashTable的代码实现已经效率低的原因    ...

funnychaos的博客 279

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HashMap安全性问题

问题类型表现根本原因数据覆盖部分键值对丢失无锁导致复合操作非原子性链表成环(JDK1.7)get()死循环,CPU 100%头插法扩容并发操作size 不准确size()返回值错误非原子操作 + 无可见性保证核心结论HashMap 的线程不安全源于其设计未考虑并发场景,多线程环境下应优先使用。

走过冬季 1160

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

hashmap为什么线程不安全_HashMap 为什么线程不安全?

作者:developer来源:https://www.cnblogs.com/developer_chan/p/10450908.html前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。1.jdk1.7中的HashMap在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道...

weixin_30369779的博客 229

Map的分类、HashMap线程不安全的说明以及使用线程安全的ConcurrentHashMap

1.1 map的分类和常见的情况        java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap。        Map主要用于存储键值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 1.1.1 HashMap  &nbs

小白程序员 1854

详解常用集合和映射中的线程安全问题

在 Java 中,集合和映射是常用的数据结构,它们分为线程安全和线程不安全两类。我们常用的集合包括:ArrayList、HashSet、CopyOnWriteArrayList、CopyOnWriteArraySet。常用的映射包括:HashMap、ConcurrentHashMap、Hashtable(Properties)。

for62的博客 954

7.多线程下put和get操作导致的HashMap线程不安全问题

谈谈HashMap线程不安全的体现HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了。那么,为什么说HashMap是线程不安全的呢?它在多线程环境下,会发生什么情况呢?3个情况,1个put会同时扩容早造成死循环,2.2个put引发扩容,另外的线程有可能get不到。3.有可能2个同时put,导致1个丢失,被后1个put给覆盖掉了。         一种情况是...

郑学炜的技术博客 1万+

hashmap为什么是线程不安全的_HashMap 为什么线程不安全?

1.jdk1.7中的HashMap1.1 扩容造成死循环分析过程1.2 扩容造成数据丢失分析过程2.jdk1.8中HashMap总结前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。1.jdk1.7中的HashMap在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jd...

weixin_39963853的博客 73

如何线程安全的使用HashMap

     面试官有问到 HashMap 是否是线程安全的,如何在线程安全的前提下使用 HashMap,其实也就是HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别。当时有些紧张只是简单说了下HashMap不是线程安全的;Hashtable 线程安全,但效率低,因为是 Hashtable 是使用 synchronized 的,所...

小桥Dopey的博客 268

HashMap线程不安全的体现,形成了链表环

谈谈HashMap线程不安全的体现   那么,为什么说HashMap是线程不安全的呢?它在多线程环境下,会发生什么情况呢? 1. resize死循环 我们都知道HashMap初始容量大小为16,一般来说,当有数据要插入时,都会检查容量有没有超过设定的thredhold,如果超过,需要增大Hash表的尺寸,但是这样一来,整个Hash表里的元素都需要被重算一遍。这叫rehash,这个成本相当的...

suixinsuoyu12519的专栏 298

【Java每日一练-Day8】HashMap线程不安全?ConcurrentHashMap线程安全实现原理

缺陷:Segment锁粒度仍不够细,当多个线程访问同一Segment时,仍需串行执行;:ConcurrentHashMap的读操作是弱一致性的,可能读取到旧数据(如扩容过程中未迁移完成的元素),但保证最终一致性,适合读多写少的并发场景。:仅保证单个操作(put、get、remove)的原子性,复合操作(如“先get判断是否存在,再put”)仍需手动加锁,否则可能出现竞态条件;锁粒度:从Segment锁(大粒度)细化到Node节点锁(小粒度),仅对哈希冲突的链表头节点或红黑树根节点加锁,其他节点可并行访问。

Xiong_Ji537的博客 993

PMV技术解析:实现AI图像长序列连贯生成的核心原理与实践

AI图像生成技术中的连贯性生成是解决多帧内容一致性的关键技术难题。其核心原理基于特征嵌入持久化和跨帧注意力机制,通过建立视觉元素的长期记忆系统,确保角色特征、场景风格在序列生成过程中的稳定性。这一技术价值在于突破了传统扩散模型单次生成的随机性限制,为游戏开发、漫画创作、视频制作等需要视觉连续性的应用场景提供了工业化解决方案。以Stable Diffusion为代表的生成模型结合PMV(Persistent Multi-View)技术,实现了从单张图像生成到长序列创作的范式转变,其中角色一致性和场景连续性是评

weixin_30843605的博客 413

都说 HashMap 是线程不安全的,到底体现在哪儿?

点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看” 作者:developercnblogs.com/develop...

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 136
上一篇: HashMap解决hash冲突的方法
下一篇: Socket长连接和短连接
SaiW-n_n-
博客等级 码龄15年 46粉丝 108原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值