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

本文涉及的产品
性能测试 PTS,5000VUM额度
简介:
先看看代码吧,模拟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;
/**
 * 测试HashMap和ConcurrentHashMap的并发性能差别。
 * 
 * @author 老紫竹 JAVA世纪网(java2000.net)
 * 
 */
public class T {
  static final int threads = 1000;
  static final int NUMBER = 1000;
  public static void main(String[] args) throws Exception {
    Map<String, Integer> hashmapSync = Collections
        .synchronizedMap(new HashMap<String, Integer>());
    Map<String, Integer> concurrentHashMap = new ConcurrentHashMap<String, Integer>();
    Map<String, Integer> hashtable = new Hashtable<String, Integer>();
    long totalA = 0;
    long totalB = 0;
    long totalC = 0;
    for (int i = 0; i <= 10; i++) {
      totalA += testPut(hashmapSync);
      totalB += testPut(concurrentHashMap);
      totalC += testPut(hashtable);
    }
    System.out.println("Put time HashMapSync=" + totalA + "ms.");
    System.out.println("Put time ConcurrentHashMap=" + totalB + "ms.");
    System.out.println("Put time Hashtable=" + totalC + "ms.");
    totalA = 0;
    totalB = 0;
    totalC = 0;
    for (int i = 0; i <= 10; i++) {
      totalA += testGet(hashmapSync);
      totalB += testGet(concurrentHashMap);
      totalC += testGet(hashtable);
    }
    System.out.println("Get time HashMapSync=" + totalA + "ms.");
    System.out.println("Get time ConcurrentHashMap=" + totalB + "ms.");
    System.out.println("Get time Hashtable=" + totalC + "ms.");
  }
  public static long testPut(Map<String, Integer> map) throws Exception {
    long start = System.currentTimeMillis();
    for (int i = 0; i < threads; i++) {
      new MapPutThread(map).start();
    }
    while (MapPutThread.counter > 0) {
      Thread.sleep(1);
    }
    return System.currentTimeMillis() - start;
  }
  public static long testGet(Map<String, Integer> map) throws Exception {
    long start = System.currentTimeMillis();
    for (int i = 0; i < threads; i++) {
      new MapPutThread(map).start();
    }
    while (MapPutThread.counter > 0) {
      Thread.sleep(1);
    }
    return System.currentTimeMillis() - start;
  }
}
class MapPutThread extends Thread {
  static int counter = 0;
  static Object lock = new Object();
  private Map<String, Integer> map;
  private String key = this.getId() + "";
  MapPutThread(Map<String, Integer> map) {
    synchronized (lock) {
      counter++;
    }
    this.map = map;
  }
  public void run() {
    for (int i = 1; i <= T.NUMBER; i++) {
      map.put(key, i);
    }
    synchronized (lock) {
      counter--;
    }
  }
}
class MapGetThread extends Thread {
  static int counter = 0;
  static Object lock = new Object();
  private Map<String, Integer> map;
  private String key = this.getId() + "";
  MapGetThread(Map<String, Integer> map) {
    synchronized (lock) {
      counter++;
    }
    this.map = map;
  }
  public void run() {
    for (int i = 1; i <= T.NUMBER; i++) {
      map.get(key);
    }
    synchronized (lock) {
      counter--;
    }
  }
}
运行结果
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的性能相当。

原帖地址:http://www.java2000.net/p12427


相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
3月前
|
存储 开发者
HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢
HashMap的key可以为null,value也可以为null;Hashtable的key不允许为null,value也不能为null;ConcurrentHashMap的key不允许为null
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
2月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
338 2
|
2月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
61 2
|
3月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
54 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
3月前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
42 5
|
3月前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
67 1
|
3月前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
39 1
|
4月前
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。