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;
/**
 * 测试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

时间: 2024-09-26 12:06:24

Java中的HashMap和ConcurrentHashMap的并发性能测试的相关文章

java线程-java中的多线程?线程的并发问题

问题描述 java中的多线程?线程的并发问题 多线程具体代表java中程序的什么?它指的实际功能上的什么情况?详细求解 解决方案 多线程和进程的关系详解: 1.当我们运行QQ程序时,操作系统就会为这个程序创建一个QQ进程(QQ~PCB)并且分配CPU.内存等资源. 2.但这个进程中包含着:发送大型的线程.接受文件的线程.发送文字信息的线程.发送文字信息的线程等多个不同功能的线程. 因而我们才能一边发送文件,一边发送文字信息同时操作.这些线程都共享着QQ进程中的CPU.内存等资源. 总结:所以说进

Java中的HashMap浅析

在Java的集合框架中,HashSet,HashMap是用的比较多的一种,顺序结构的ArrayList.LinkedList这种也比较多,而像那几个线程同步的容器就用的比较少,像Vector和HashTable,因为这两个线程同步的容器已经不被JDK推荐使用了,这是个比较老式的线程安全的容器,JDK比较推荐的是采用Collections里面的关于线程同步的方法. 问题来源: 1.为什么要有HashMap? <Thinking In Java>里面有一个自己采用二维数组实现的保存key-valu

为什么Java中的HashMap&amp;lt;K, V&amp;gt;的get函数是get(Object key),而不是get(K key)?

帮别人的代码改bug,发现有一大堆bug是由get或者remove传递进去的参数类型不匹配而造成的. 比如: Map<Short, String> m = new HashMap(); m.put(new Short((short) 2), "2222"); System.out.println(m.get(2)); 上面的代码输出是null. 一般人很难发现传递进去的int和Short类型不匹配,而且IDE,编译器也没有提示.当然通过一些分析工具可以检查出来. 真的感到很

深入理解Java中的HashMap的实现机制_java

如果任何人让我描述一下HashMap的工作机制的话,我就简单的回答:"基于Hash的规则".这句话非常简单,但是要理解这句话之前,首先我们得了解什么是哈希,不是么? 什么是哈希 哈希简单的说就是对变量/对象的属性应用某种算法后得到的一个唯一的串,用这个串来确定变量/对象的唯一性.一个正确的哈希函数必须遵守这个准则. 当哈希函数应用在相同的对象或者equal的对象的时候,每次执行都应该返回相同的值.换句话说,两个相等的对象应该有相同的hashcode. 注:所有Java对象都从Objec

Java中对HashMap的深度分析

在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键.由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题.找遍了大大小小的论坛,也把<Java 虚拟机规范>,<apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector>,和<Thinking in Java>翻了也找不到很好的答案,于是一气之下把JDK的 src 解压出来研究,扩然开朗,遂写此文,跟大家分享感

Java中对HashMap的深度分析与比较

比较 在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键.由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题.找遍了大大小小的论坛,也把<Java 虚拟机规范>,<apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector>,和<Thinking in Java>翻了也找不到很好的答案,于是一气之下把JDK的 src 解压出来研究,扩然开朗,遂写此文,跟大家

Java中对HashMap的深度分析_JSP编程

在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键.由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题.找遍了大大小小的论坛,也把<Java 虚拟机规范>,<apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector>,和<Thinking in Java>翻了也找不到很好的答案,于是一气之下把JDK的 src 解压出来研究,扩然开朗,遂写此文,跟大家分享感

Java数组到HashMap之算法解释

一.数组是什么? 忘了在哪本书里曾看到过类似这样的一句话"所有的数据结构都是数组的演化",想想其实是有道理的,因为计算机的内存其实就是线性的存储空间. Java示例代码: int[] array = new int[5] 忽略对象头信息和数组长度信息,JVM执行时会在堆中分配20个字节的内存空间,看起来就是这样的: 这样的数据结构可以很方便地通过数组下标存取数据,但在查找时需要遍历数组,平均时间复杂度为O(n/2). 当数据量很大或者查找操作频繁的时候,这样的遍历操作几乎是不可接受的.

Java中的几个HashMap/ConcurrentHashMap实现分析

一.HashMap,即java.util.HashMap 标准链地址法实现.这个不用多解析,下图十分明了.(图片来自网络) 二.Collections.synchronizedMap() 函数返回的线程安全的HashMap 这个的实现比较简单. 代码中有: private final Map<K,V> m; // Backing Map final Object mutex;// Object on which to synchronize 基本所有的方法都加上了synchronized(mu