为什么要使用ConcurrentHashMap

HashMap为什么线程不安全?浅析高并发情况下的HashMap 1.Hashmap在插入元素过多的时候需要进行Resize; 2.Hashmap扩容时Resize的ReHash步骤,并发的情况下可能会形成链表环; 阅读详情

在这里插入图片描述

在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap的登场机会。

一.线程不安全的HashMap

在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。例如,执行以下代码会引起死循环。

   final HashMap<String, String> map = new HashMap<String, String>(2);
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            map.put(UUID.randomUUID().toString(), "");
                            System.out.println(map.toString());
                        }
                    }, "ftf" + i).start();
                }
            }
        }, "ftf");
        t.start();
        t.join();

执行结果:
在这里插入图片描述
HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry。

二.效率低下的HashTable

HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮询状态。如线程1使用put进行元素添加,线程2不但不能使用put方法添加元素,也不能使用get方法来获取元素,所以竞争越激烈效率越低。

图2-1 部分HashTableAPI

在这里插入图片描述

三.ConcurrentHashMap的锁分段技术可有效提升并发访问率

HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术。首先将数据分成一段一段地存
储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

返回专栏目录
Java中的ConcurrentHashMap的使用与原理 ConcurrentHashMap 是 Java 中为‌高并发场景‌设计的线程安全哈希表实现,位于 java.util.concurrent 包。它解决了 Hashtable 和 Collections.synchronizedMap() 的锁粒度过大导致的性能问题,在保证线程安全的同时显著提升并发吞吐量。ConcurrentHashMap 是 Java 中线程安全的哈希表实现,其核心原理在于通过精细化锁机制(分段锁或 CAS + synchronized)实现高并发性能。 阅读详情

相关推荐

WorkBuddy 实战:从聊天窗口到 AI 工作台,打造个人自动化助理

大模型时代,对话式 AI 常被当作高级搜索框,难以沉淀为生产力。其根源在于上下文断裂——每次对话都从零开始。AI Agent 的核心原理是通过状态保持、工具调用与流程复用,将临时交互固化为可重复的协作机制。WorkBuddy 作为个人 AI 工作台,以 Agent + Skill + 工作流架构解决该问题:Skill 封装操作手册,工作区沉淀知识上下文,自定义指令约束输出风格。这种设计让周报生成、会议纪要、文档初稿、专利检索辅助等重复劳动实现流程化自动产出。掌握 WorkBuddy 怎么用,关键在于从自己重

weixin_33834910的博客 325

使用ConcurrentHashMap的原因

1,传统的HashMap在多线程环境下,进行put操作,会导致自身的数据连接的链表产生循环,一旦产生循环,后续节点就永远不为空,永远无法跳出循环。 2,线程安全的HashTable 是使用synchronized保证线程安全的,但是在线程竞争激烈的时候,HashTable的效率非常低,因为当一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法,会进入阻塞和轮询状态

xuqiaobo的博客 542

从零组装一台会‘看’的无人机:手把手教你配置NUC机载电脑与D435深度相机(环境搭建篇)

本文详细介绍了如何从零开始组装一台具备视觉能力的智能无人机,重点讲解了NUC机载电脑与D435深度相机的配置方法。通过Ubuntu系统安装、ROS环境搭建、深度学习框架配置等步骤,帮助开发者实现无人机的自主避障和目标跟踪功能。文章还提供了性能优化和常见问题解决方案,是无人机视觉系统开发的实用指南。

weixin_30915275的博客 396

为什么使用ConcurrentHashMap

JDK1.7是在调用size()方法才去计算,其实在并发集合中去计算size是没有多大的意义的,因为size是实时在变的,只能计算某一刻的大小,但是某一刻太快了,人的感知是一个时间段,所以并不是很精确。计算ConcurrentHashMap的元素大小是一个有趣的问题,因为他是并发操作的,就是在你计算size的时候,他还在并发的插入数据,可能会导致你计算出来的size和你实际的size有相差(在你return size的时候,插入了多个数据),要解决这个问题,JDK1.7版本用两种方案。

qq_42600094的博客 2792

爬取百度图片

最开始,我们想要爬取图片,首先需要打开百度图库,然后在搜索栏中输入自己想要的图片(比如说壁纸)。接着右键检查,点击网络:起初可能没有名称信息,刷新界面就可以了。打开信息,查看标头内容可以看到请求URL为:复制这串URL,然后在浏览器中打开这个就是我们搜索的壁纸图片的网页内容。怎么找到图片的URL呢?在上述内容中,找到data,可以发现里面每隔一个aiEditData,下面代码的形式是一样的,就相当于一张图片。

weixin_54143563的博客 1939

GAMES101学习-第8课进行shader的初步了解

详细理解课上展示的像素着色器GLSL,以及了解了API、OpenGL、DirectX到底是什么,还有shadertoy这个网站的初步探索。

qq_41835314的博客 1917

HashMap是线程安全的吗?为什么呢?

HashMap是线程安全的吗?为什么呢?

我从不打没有准备的仗! 1万+

arcgis导出自身相交数据

今天接到一个客户需求,一份面文件,里面有好多元素是两两相交甚至是三个相交的,现在要把这些重叠部分提取出来,并且把相交部分的原始要素的名称也保留在字段中,也就是说名称这个会有好多个名称字段,如果两个要素相交那就是前两个名称字段有值,后面的为空,如果是三个要素相交,那么输出的这个要素就是前三个名称字段有值,后面的为空,嗯,这里也不太确定会出现多少个名称字段,这个需要依照数据来定。 这是原始数据,...

miaowumi92的博客 6787

hashmap为什么不安全

第一点多线程同时put的时候 在某一时刻同时操作HashMap并执行put操作,而有大于两个key的hash值相同,如图中a1、a2,这个时候需要解决碰撞冲突,而解决冲突的办法上面已经说过,对于链表的结构在这里不再赘述,暂且不讨论是从链表头部插入还是从尾部初入,这个时候两个线程如果恰好都取到了对应位置的头结点e1,而最终的结果可想而知,a1、a2两个数据中势必会有一个会丢失     第二点...

妖君你好的博客 446

代谢组数据分析(五):代谢组的功能富集分析

本文介绍了代谢组数据分析中的功能分析,包括代谢物富集分析、GSEA和ssGSEA方法。文章详细阐述了分析原理、应用背景、数据准备、统计方法以及结果解释,强调了在代谢通路和代谢物ID对应关系建立、差异代谢物筛选、富集程度计算等方面的关键步骤。通过这些方法,可以揭示差异代谢物在生物过程中的作用,为疾病研究和药物开发提供依据。

专注生信领域 5977

Oracle EBS 寄销/VMI(1)-->基础设置

名词解释:     BPA:一揽子采购协议     BPR:一揽子发放     SR:来源补充规则     ASL:合格供应商列表     VMI: 供应商管理库存     寄售(Consignment)是把货物放在客户那里,客户要用的时候才付款的库存,一般是指卖方把

陈显平的专栏-Oracle EBS 1万+

ConcurrentHashMap

这是为了观察 e 节点和 next 节点的状态,Thread-0 单步执行到 594 行,再 594 处再添加一个断点(条件Thread.currentThread().getName().equals(“Thread-0”))这时可以在 Variables 面板观察到 e 和 next 变量,使用 view as -> Object 查看节点状态。get 时并未加锁,用了 UNSAFE 方法保证了可见性,扩容过程中,get 先发生就从旧表取内容,get 后发生就从新表取内容。

shall_zhao的博客 1222

讲透 ABAP CDS 注解名称:简单名、结构化名、@ 与 @<、作用域与分组

本文从开发者角度梳理ABAP CDS注解的命名规则与实战写法,重点解析: 语法规则:@与@<的使用场景、结构化命名规范、作用域唯一性要求 评估机制:ABAP运行时与组件框架的注解处理差异 分组技巧:花括号分组简化重复前缀的书写 实战示例:包含完整CDS View Entity(演示注解分组与@<用法)和ABAP报表(读取打印注解) 常见问题:命名错误导致激活失败、框架忽略等注意事项 最后通过航空预订统计案例,展示如何结合多种注解类型实现业务需求。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 261

为什么 ConcurrentHashMap 比 Hashtable 效率高

最大限度地减少了线程间的竞争,允许更多的操作(尤其是读操作和操作不同桶/段的写操作)真正并行执行。ConcurrentHashMap 比 Hashtable 效率高主要是因为它们在实现线程安全时采用了。单一的全局锁导致所有同步操作都必须串行化,在高并发环境下成为严重的性能瓶颈。,是现代 Java 并发编程中替代。的首选线程安全 Map 实现。

牛马baby的博客 874

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

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

concurrenthashmap是什么锁_多线程为什么要用ConcurrentHashMap

今天我们要说的是关于集合的问题,实际上跟锁也有一定的关系,让我们来一起看看吧。一、简介1、是什么 ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代HashTable。对于ConcurrentHashMap是如何提高其效率的,可能大多人只是知道它使用了多个锁代替HashTable中的单个锁,也就是锁分离技术(Lock Stripping)。2、为什么为什...

weixin_30111277的博客 358

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ConcurrentHashMap杂谈

为什么使用ConcurrentHashMap 在并发编程中使用HashMap可能导致程序死循环,而使用线程安全的HashTable效率又非常低下 线程不安全的HashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100% 死循环案例: final HashMap<String, String> map = new HashMap<String, String>(2); Thread t = new Thread(new Runn

qq_46153765的博客 5776

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ConcurrentHashMap的使用场景

,因此,考虑使用ConcurrentHashMap。

llg___的博客 1235

concurrentHashMap

像我们知道的Arraylist,LinkedList,HashMap,HashSet…都是线程不安全的,而Vector,Stack,HashTable是又是线程安全的 那么如果想在多线程下使用ArrayList怎么办呢? 方法: 自己加锁 使用synchronizedList 使用JUC里面的CopyOnWriteArrayList 如果想要在多线程下使用HashMap怎么办呢? 方法: HashTable(不太建议使用) ConcurrentHashMap(推荐使用) ...

wkh18891843165的博客 256

从ConcurrentHashMap看锁优化思路

我想,聊ConcurrentHashMap一定离不开并发,我们都知道他是为了解决HashMap的并发安全问题而生,那你有没有想过,我们在背八股的时候,都说HashTable和HashMap最大的不同便是HashTable是线程安全的,那么为什么要有ConcurrentHashMap?留下这个思考后,我们来想,造成并发安全的原因是什么?是不是不同线程同时对共享内存的访问,即我们需要一种手段来保证并发的安全性。

sbysgysby的博客 2099

ConcurrentHashMap的使用

ConcurrentHashMap是Java 并发包(java.util.concurrent)中提供的一个线程安全且高效的哈希表实现,用于在并发环境中存储键值对,它允许在多个线程之间安全地共享和修改数据,使得开发者无需显式同步代码就能在并发环境下安全使用。与同样是线程安全的哈希表HashTable相比,ConcurrentHashMap具有更高的并发效率。总之ConcurrentHashMap是一个高性能的Java并发容器,是多线程下常用的map容器,其使用方法基本可以参考HashMap。

qq_38875964的博客 829

HashMap和ConcurrentHashMap

特性HashMap线程安全性非线程安全,必须手动同步线程安全,内建并发控制机制锁机制无锁机制,需要外部同步使用分段锁或其他细粒度锁Null 键和值允许一个null键,多个null值不允许null键或null值迭代器Fail-fast弱一致性迭代器,可以并发修改性能在单线程中较快,线程不安全在高并发环境下性能更好并发操作需要外部同步机制支持高并发操作,线程间并发无锁竞争适用场景单线程,手动同步的多线程高并发的多线程环境适合在多线程环境下使用,而HashMap。

qq_45884192的博客 1263

从源码解读为什么使用ConcurrentHashMap,而不使用Hashtable与HashMap

从源码解读为什么使用ConcurrentHashMap,而不使用Hashtable与HashMap

Charles_Clark的博客 1230

ConcurrentHashMap CAS 详解

ConcurrentHashMap CAS 详解

T_Y_F_的博客 1640

为什么要使用ConcurrentHashMap而不是HashMap

Hashtable为什么性能低? HashMap高并下发会发生什么? HashMap内部结构是什么? ConcurrentHashmap为什么可以支持高并发?为什么比hashmap读取效率高?

l_h_y123的专栏 9169
上一篇: ThreadPoolExecutor线程池的实现原理
下一篇: Java中的锁之重入锁:ReentrantLock
爱写Bug的麦洛
博客等级 码龄11年 1万+粉丝 201原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值