HashMap和ConcurrentHashMap的并发性能测试

企业数字化转型的 4A 架构指南:从概念解读到 TOGAF 阶段对应 4A企业架构是中国数字化转型实践中总结的简化框架,包含业务、应用、数据和技术四个架构层。它自上而下形成业务驱动应用的指导关系,自下而上构建技术支撑数据的实现路径,与国际标准TOGAF核心内容高度对应。该模型通过统一语言、战略对齐和系统梳理,有效连接业务需求与IT实施,已成为企业架构规划的实用工具。其分层结构清晰展示了从业务目标到技术落地的完整推导链,特别适合中国企业的数字化转型场景。 阅读详情

原文:http://www.java2000.net/p12427

先看看代码吧,模拟1000个并发,每个测试1000次操作,循环测试10轮。分别测试Put和Get操作
  1. import java.util.Collections;
  2. import java.util.HashMap;
  3. import java.util.Hashtable;
  4. import java.util.Map;
  5. import java.util.concurrent.ConcurrentHashMap;
  6. /**
  7.  * 测试HashMap和ConcurrentHashMap的并发性能差别。
  8.  * 
  9.  * @author 老紫竹 JAVA世纪网(java2000.net)
  10.  * 
  11.  */
  12. public class T {
  13.   static final int threads = 1000;
  14.   static final int NUMBER = 1000;
  15.   public static void main(String[] args) throws Exception {
  16.     Map<String, Integer> hashmapSync = Collections
  17.         .synchronizedMap(new HashMap<String, Integer>());
  18.     Map<String, Integer> concurrentHashMap = new ConcurrentHashMap<String, Integer>();
  19.     Map<String, Integer> hashtable = new Hashtable<String, Integer>();
  20.     long totalA = 0;
  21.     long totalB = 0;
  22.     long totalC = 0;
  23.     for (int i = 0; i <= 10; i++) {
  24.       totalA += testPut(hashmapSync);
  25.       totalB += testPut(concurrentHashMap);
  26.       totalC += testPut(hashtable);
  27.     }
  28.     System.out.println("Put time HashMapSync=" + totalA + "ms.");
  29.     System.out.println("Put time ConcurrentHashMap=" + totalB + "ms.");
  30.     System.out.println("Put time Hashtable=" + totalC + "ms.");
  31.     totalA = 0;
  32.     totalB = 0;
  33.     totalC = 0;
  34.     for (int i = 0; i <= 10; i++) {
  35.       totalA += testGet(hashmapSync);
  36.       totalB += testGet(concurrentHashMap);
  37.       totalC += testGet(hashtable);
  38.     }
  39.     System.out.println("Get time HashMapSync=" + totalA + "ms.");
  40.     System.out.println("Get time ConcurrentHashMap=" + totalB + "ms.");
  41.     System.out.println("Get time Hashtable=" + totalC + "ms.");
  42.   }
  43.   public static long testPut(Map<String, Integer> map) throws Exception {
  44.     long start = System.currentTimeMillis();
  45.     for (int i = 0; i < threads; i++) {
  46.       new MapPutThread(map).start();
  47.     }
  48.     while (MapPutThread.counter > 0) {
  49.       Thread.sleep(1);
  50.     }
  51.     return System.currentTimeMillis() - start;
  52.   }
  53.   public static long testGet(Map<String, Integer> map) throws Exception {
  54.     long start = System.currentTimeMillis();
  55.     for (int i = 0; i < threads; i++) {
  56.       new MapPutThread(map).start();
  57.     }
  58.     while (MapPutThread.counter > 0) {
  59.       Thread.sleep(1);
  60.     }
  61.     return System.currentTimeMillis() - start;
  62.   }
  63. }
  64. class MapPutThread extends Thread {
  65.   static int counter = 0;
  66.   static Object lock = new Object();
  67.   private Map<String, Integer> map;
  68.   private String key = this.getId() + "";
  69.   MapPutThread(Map<String, Integer> map) {
  70.     synchronized (lock) {
  71.       counter++;
  72.     }
  73.     this.map = map;
  74.   }
  75.   public void run() {
  76.     for (int i = 1; i <= T.NUMBER; i++) {
  77.       map.put(key, i);
  78.     }
  79.     synchronized (lock) {
  80.       counter--;
  81.     }
  82.   }
  83. }
  84. class MapGetThread extends Thread {
  85.   static int counter = 0;
  86.   static Object lock = new Object();
  87.   private Map<String, Integer> map;
  88.   private String key = this.getId() + "";
  89.   MapGetThread(Map<String, Integer> map) {
  90.     synchronized (lock) {
  91.       counter++;
  92.     }
  93.     this.map = map;
  94.   }
  95.   public void run() {
  96.     for (int i = 1; i <= T.NUMBER; i++) {
  97.       map.get(key);
  98.     }
  99.     synchronized (lock) {
  100.       counter--;
  101.     }
  102.   }
  103. }

运行结果:
Put time HashMapSync=3966ms.
Put time ConcurrentHashMap=1892ms.
Put time Hashtable=3892ms.
Get time HashMapSync=3812ms.
Get time ConcurrentHashMap=1828ms.
Get time Hashtable=3985ms.


结论:
ConcurrentHashMap的性能比同步的HashMap快一倍左右
同步的HashMap和Hashtable的性能相当
Android 13 内置xapk安装包的方法 安装xapk 内置xapk 阅读详情

相关推荐

从工业夹爪到Shadow Hand:一文看懂机器人灵巧手的硬件进化史(附避坑指南)

本文详细解析了机器人灵巧手从工业夹爪到Shadow Hand的硬件进化历程,涵盖刚性夹持器、自适应夹持器到多指灵巧手的技术突破。文章还提供了选购指南与技术避坑策略,帮助读者根据操作复杂度和环境结构化程度选择最适合的解决方案,适用于制造业、医疗和服务业等多个领域。

weixin_29074409的博客 485

concurrenthashmap和hashtable多线程效率对比

concurrenthashmap和hashtable多线程效率对比

efggfxfvhh的博客 1981

CANoe实战:手把手教你用J1939.dbc发送超8字节长帧报文(附完整CAPL代码)

本文详细解析了使用CANoe和J1939.dbc实现超8字节长帧报文的分包发送技术,提供完整的CAPL代码实现与优化策略。内容涵盖J1939.dbc配置、分包发送模块设计、接收端处理逻辑,并与ISO 15765-2协议进行深度对比,帮助开发者构建高效可靠的商用车通信解决方案。

weixin_29169899的博客 394

HashMap 与 ConcurrentHashMap 的异同

5. 效率:由于 ConcurrentHashMap 和 HashMap 在数据结构上的差别,导致它们在存取数据的效率上也有所不同,在单线程环境下,因为没有锁竞争的问题,HashMap 的效率要比 ConcurrentHashMap 高,而在多线程环境下,ConcurrentHashMap 的效率要优于 HashMap。而 ConcurrentHashMap 是线程安全的,采用了分段锁技术,允许多个线程同时访问不同的 Segment,从而提高并发性能,适合于高并发环境。2. 不允许键和值为 null;

luoluoal的博客 1486

全国职业院校技能大赛-大数据应用赛项-数据挖掘-01

-----------------------推荐Top5结果如下--------------------------------------------第一条数据前10列结果展示为:----------------------------------------相同种类前10的id结果展示为:--------------------相似度top5(商品id:14,平均相似度:0.522356)相似度top1(商品id:1,平均相似度:0.983456)若属于该spu_id,则内容为1否则为0。

Eternity_04的博客 1956

GlobalPlatform Technology Secure Channel Protocol ‘03‘ 标准 - 安全通道协议简介

按照GlobalPlatform Technology Secure Channel Protocol '03' (SCP03)标准,描述了如何利用S-MAC,S-RMAC,S-ENC进行安全通信的过程。

mmmx777的专栏 6093

HashMap/ConcurrentHashMap在单线程模式下的性能比较

起源 阅读源码发现jdk8中ConcurrentHashMap是基于synchronized来加锁实现多线程安全的,但是实现方式上与早期的HashTable又有了很大的区别,虽然都是使用synchronized来加锁,但是锁的粒度不一样,大致可以作如下理解: HashTable JDK1.0版本开始提供,为了保证线程安全,内部使用了1把锁,读读、读写操作均会锁竞争 HashTable这种键值...

明月专栏 7535

COMSOL电弧放电仿真:四场耦合与磁流体建模实战指南

多物理场耦合仿真是现代工程中模拟复杂物理过程的重要手段。电弧本质上是电场、磁场、流场与温度场四场相互耦合的非线性系统,其行为由磁流体力学(MHD)方程描述。通过COMSOL等工具构建电弧模型,可准确预测温度分布、流场结构和电极烧蚀,为开关电器设计、等离子体应用等提供数据支撑。在高压电器开断、电弧切割、激光打孔等工程问题中,高效求解MHD耦合模型是关键。然而,电弧仿真涉及物性参数强非线性、边界条件设置、求解器配置以及移动网格处理等挑战。以二维轴对称电弧模型为例,系统梳理磁流体方程落地、多物理场耦合节点配置、收

weixin_30047059的博客 136

 Hashtable、HashMap、Collections.synchronizedMap()、ConcurrentHashMap 读写性能比较

1 写性能,100万个数据,开启100个线程去写 1.1 Hashtable public class T_Hashtable { static Hashtable<UUID, UUID> m = new Hashtable<>(); static int count = Constants.COUNT; static UUID[] keys = new UUID[count]; static UUID[...

蓝天的博客 1078

VsCode安装和配置c/c++环境(超完整,小白专用)

1. vsCode配置C/C++环境 1. vsCode下载和安装 1. 下载Microsoft vsCode [vsCode在这里插入图片描述官网下载: https://code.visualstudio.com/ 2. 安装vsCode 3. 下载中文插件 我这边已经下载过,刚卸载但是没有重启编译器,所以界面显示了中文 2. MinGW编译器下载和配置 1. 下载MinGW 在线安装——下载MinGW-W64-install.exe(速度慢) 下载压缩包——×86_64-posix-

黄化的多多 60万+

Unity机械拆装实战:5步搞定发动机模型交互式装配(附完整代码)

本文详细介绍了在Unity中实现高交互性机械拆装仿真的完整流程。以发动机模型为例,通过5个核心步骤:项目初始化与模型准备、核心交互实现、智能装配逻辑、场景管理与相机控制、进阶优化与扩展,系统讲解了从零构建交互式装配功能的方法,并提供了完整的代码示例。

weixin_28049429的博客 217

ConcurrentHashMap 和 HashMap 的区别及性能比较

在 Java 中,和HashMap是两种常见的Map实现。尤其在多线程环境下,它们在设计和行为上存在一些关键的区别。在本文中,我们将深入探讨这两者之间的主要区别,并通过简单的代码示例演示它们的使用。

weixin_54563083的博客 818

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队

OpenClaw多Agent模式为企业提供高效的AI助手团队解决方案。通过创建4个独立的飞书机器人(主助理、内容创作、技术开发、AI资讯),每个连接专属Gateway和Agent模型(如Claude Opus/Sonnet、Gemini 2.5),实现专业分工。相比单Agent模式,多Gateway架构具有配置清晰、互不干扰、无需手动切换等优势。系统采用Profile隔离机制,各Agent拥有独立配置和端口。部署过程包括创建机器人应用、配置Agent、运行自动化脚本等步骤,支持私聊或群组@使用。日常提供状态

Maynor的博客 5104

java 并发map_Java中的HashMap和ConcurrentHashMap的并发性能测试

先看看代码吧,模拟1000个并发,每个测试1000次操作,循环测试10轮。分别测试Put和Get操作import java.util.Collections;import java.util.HashMap;import java.util.Hashtable;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/*...

weixin_40002224的博客 248

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java中的HashMap和ConcurrentHashMap的并发性能测试

先看看代码吧,模拟1000个并发,每个测试1000次操作,循环测试10轮。分别测试Put和Get操作import java.util.Collections;import java.util.HashMap;import java.util.Hashtable;import java.util.Map;import java.util.concurrent.Concurren...

weixin_33991418的博客 268

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ConcurrentHashMap与HashMap的不同,以及二者的性能测试比较

好像今天没有什么源码读,那么就来看看java的这两种HashMap有啥不一样的地方吧,在这之前先普及一下HashMap的一些基本知识:   (1)放入HashMap的元素是key-value对。   (2)底层说白了就是以前数据结构课程讲过的散列结构。   (3)要将元素放入到hashmap中,那么key的类型必须要实现实现hashcode方法,默认这个方法是根据对象的地址来计算的,具体我...

keke_Xin的专栏 2202

如何线程安全的使用HashMap

众所周知,HashMap是线程不安全的,不能在多线程高并发场景下使用。(具体原因→点击) 如何线程安全的使用HashMap? Collections.synchronizeMap(hashMap) ConcurrentHashMap ① Collections.synchronizedMap() 查看源码可...

weixin_30830327的博客 130

ConcurrentHashMap vs HashTable vs HashMap 全面对比

线程安全性HashMap非线程安全。多个线程同时读写同一个HashMap实例时,可能会导致数据不一致(如丢失更新)或抛出异常。适用于单线程环境或只读多线程环境。Hashtable线程安全。其实现方式是在所有公开的方法上添加关键字,进行方法级别的同步。这意味着同一时间只有一个线程能操作整个Hashtable。虽然保证了线程安全,但并发性能很差(高并发下会成为瓶颈)。线程安全。它采用了更精细的锁机制(在 Java 7 及之前主要是分段锁,在 Java 8 及之后主要是CAS +锁住单个桶)。

qq_45846324的博客 665

多线程下使用HashMap

多线程下使用HashMap 如果在被问及:“HashMap是否线程安全,如何线程安全地使用HashMap?”,你会如何回答,以前的话我会这样回答:“HashMap是非线程安全的,如果要保证线程安全的话,就需要使用Hashtable。”但是经过最近的学习,我又了解到了ConcurrentHashMap和SyschronizedMap,其实这个问题的本质就是:HashMap、Hashtable、ConcurrentHashMap、SyschronizedMap的原理与区别。接下来我就总结一下的我的学习成果: 1

轻狂書生的博客 9538

Map深度解析:HashMap、TreeMap、ConcurrentHashMap全对比

Map是Java中使用最频繁的集合类型之一,用于存储键值对(Key-Value)。不同的Map实现类在数据结构、线程安全性、性能表现上差异巨大。本文将从HashMap的哈希表与拉链法讲起,深入TreeMap的红黑树自平衡机制,最终解析ConcurrentHashMap的高并发分段锁技术。通过完整的代码示例和性能数据,为你构建完整的Map知识体系。

caj的博客 1230

HashMap线程安全问题及解决方案

为什么线程不安全个人觉得 HashMap 在并发时可能出现的问题主要是两方面,首先如果多个线程同时使用put方法添加元素,而且假设正好存在两个 put 的 key 发生了碰撞(根据 hash 值计算的 bucket 一样),那么根据 HashMap 的实现,这两个 key 会添加到数组的同一个位置,这样最终就会发生其中一个线程的 put 的数据被覆盖。第二就是如果多个线程同时检测到元素个数超过数组...

想飞的企鹅 8847

Java中HashMap与Hashtable的深度对比:从历史演变到现代应用

Java中HashMap与Hashtable的深度对比:从历史演变到现代应用

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 3014
上一篇: 正在整理Loadrunner进行性能测试的使用体会,有兴趣的可以去看看
下一篇: 今天给山东省劳动厅做迁移和测试汇报,希望顺利
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值