`
逆风的香1314
  • 浏览: 1416285 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HashMap和ConcurrentHashMap的并发性能测试

阅读更多

原文: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的性能相当
分享到:
评论

相关推荐

    java7-8中的 HashMap和ConcurrentHashMap全解析.pdf

    ConcurrentHashMap在Java 8中放弃了分段锁,改用ForkJoinPool和CAS(Compare And Swap)操作,提高了并发性能。初始化时,它会创建一个固定大小的数组,并在put过程中: 1. 初始化数组,包括计算初始大小和填充因子...

    java7-8中的 HashMap和ConcurrentHashMap全解析

    在Java编程语言中,`HashMap`和`ConcurrentHashMap`是两种非常重要的数据结构,它们都属于`java.util`包,用于存储键值对。本文将深入解析这两个类在Java 7和8版本中的实现原理、特点以及使用场景。 首先,`HashMap...

    HashMap与ConcurrentHashMap面试要点.pdf

    ### HashMap和ConcurrentHashMap...综上所述,面试时通常会针对HashMap和ConcurrentHashMap的实现原理、它们的差异、以及在并发环境下如何保证数据的一致性和线程安全进行提问。了解这些知识点有助于在面试中脱颖而出。

    详谈HashMap和ConcurrentHashMap的区别(HashMap的底层源码)

    HashMap和ConcurrentHashMap的区别 HashMap和ConcurrentHashMap是Java语言中两个常用的哈希表实现,它们都继承自AbstractMap类,实现了Map接口,但是它们之间存在着一些关键的区别。 首先,从数据结构上讲,...

    Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)

    在Java编程中,Map接口是用于存储键值对的数据结构,而Java提供了多种Map的实现,包括TreeMap、HashMap和ConcurrentSkipListMap。...在实际使用中,应结合性能测试和业务需求来确定最适合的Map类型。

    2.Java7_8+中的+HashMap+和+ConcurrentHashMap+全解析1

    ConcurrentHashMap在Java 8中也进行了优化,取消了分段锁,改用ForkJoinPool和CAS操作,实现更为细粒度的并发控制,进一步提升了并发性能。 对于Java 8的ConcurrentHashMap,其内部结构更为复杂,使用了Node节点...

    史上最详细详解hashmap、concurrenthashmap

    这种改进是为了在空间和性能之间取得更好的平衡。 ConcurrentHashMap 则采用了分段锁的设计,它将整个映射表分成多个段(Segment),每个段都是一个独立的 HashMap 实例,并且每个段有自己的锁。这种方式允许并发的...

    HashMap,HashTable,ConcurrentHashMap之关联.docx

    ConcurrentHashMap 使用了分段锁的机制,每个段都独立锁定,提高了并发性能。 HashMap 和 HashTable 的区别 1. 线程安全性:HashMap 是非线程安全的,HashTable 是线程安全的。 2. 键和值的 null 值:HashMap 的键...

    java多线程并发及集合框架面试题

    本题旨在考察候选人在实际并发场景下对 HashMap 和 ConcurrentHashMap 的理解和应用。 HashMap 和 ConcurrentHashMap 的主要区别在于它们对并发操作的支持。HashMap 是非线程安全的,意味着在多线程环境中,如果不...

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...

    Java-并发容器之ConcurrentHashMap

    总的来说,ConcurrentHashMap是Java并发编程中的重要组件,通过高效的并发控制策略和优化的数据结构,实现了在高并发场景下的高效并发访问。了解并掌握其原理对于提升Java并发编程能力至关重要。

    HashMap与CorruntHashMap性能对比

    总的来说,理解`HashMap`和`ConcurrentHashMap`的工作原理以及它们在性能上的差异,对于优化Java程序的运行效率和并发性能至关重要。开发者可以根据实际情况,选择最适合的数据结构,以实现更高效、更稳定的应用。

    java的hashMap多线程并发情况下扩容产生的死锁问题解决.docx

    在Java的HashMap中,多线程并发环境...总之,理解HashMap的扩容机制和潜在的问题对于编写高性能、线程安全的Java程序至关重要。在多线程环境下,合理选择数据结构和同步策略可以避免这类问题,确保程序的稳定性和效率。

    hashMap和hashTable的区别

    尽管它们在功能上有很多相似之处,但在实现细节和性能特性上存在显著差异。 #### 二、主要区别 1. **空值支持**: - **HashMap**:允许使用 `null` 键和 `null` 值。 - **HashTable**:不允许使用 `null` 键或 `...

    24 经典并发容器,多线程面试必备。—深入解析ConcurrentHashMap.pdf

    【并发容器的线程安全性】与`HashMap`不同,`ConcurrentHashMap`通过采用非阻塞算法(如CAS操作)和分段锁机制来保证并发性能,避免了整个表的锁定,提高了在多线程环境下的并发性和性能。 【存储结构】`...

    ConcurrentHashMap的实现原理(JDK1.7和JDK1.8).pdf

    总的来说,`ConcurrentHashMap`的设计是为了解决多线程环境下HashMap的线程安全问题,通过分段锁和CAS操作实现了高效并发的哈希表。从JDK1.7到1.8的演变,反映了并发编程中对性能和线程安全的不断追求。

    ConcurrentHashMap源码解析

    通过以上分析,我们可以看到ConcurrentHashMap如何通过锁分段技术来解决HashMap在并发环境下的线程安全问题,并通过巧妙的设计减少线程间锁的竞争,从而提升性能。因此,在设计需要高并发性能的程序时,...

    一文让你彻底理解JavaHashMap和ConcurrentHashMap

    HashMap适用于单线程环境,提供快速的插入和查找,而ConcurrentHashMap在多线程环境下保证了线程安全和高并发性能。理解它们的内部工作原理对于优化代码性能和避免并发问题至关重要。在实际开发中,根据具体场景选择...

    hashmap面试题_hashmap_

    面试中,可能会被问及HashMap的性能优化、内存占用分析、以及在特定场景下的选择,如并发环境、内存敏感的应用等。 总结,HashMap是Java编程中的基础工具,掌握其工作原理和常见面试题,不仅能帮助我们应对面试,更...

Global site tag (gtag.js) - Google Analytics