测试HashTable、Collections.synchronizedMap和ConcurrentHashMap的性能
对于map的并发操作有HashTable、Collections.synchronizedMap和ConcurrentHashMap三种,到底性能如何呢?
测试代码:
package com.yangyang; import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; public class T {
/**用于测试的线程数量**/
public static final int threads = 100;
/**每个线程往map中塞的数量**/
public static final int NUMBER =100; public static void main(String[] args) throws Exception{
Map<String, Integer> syncHashMap=Collections.synchronizedMap(new HashMap<String, Integer>());
Map<String, Integer> concurrentHashMap=new ConcurrentHashMap<String, Integer>();
Hashtable<String, Integer> hashtable=new Hashtable<String, Integer>(); long totalA = 0;
long totalB = 0;
long totalC = 0;
//循环10此,累计时间,便于观察
for (int i = 0; i <= 10; i++) {
// System.out.println("第"+i+"次测试put方法");
totalA += testPut(syncHashMap);
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(syncHashMap);
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."); } private static long testPut(Map<String, Integer> map) throws Exception{
long start = System.currentTimeMillis(); //同时开threads个线程
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 MapGetThread(map).start();
}
while (MapGetThread.counter > 0) {
Thread.sleep(1);
}
return System.currentTimeMillis() - start;
}
}
/**
* put线程类
* @author shunyang
* @date 2015年3月6日 下午4:24:42
*/
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++;//每调用一次构建函数,计数器加1
// System.out.println("线程key为:"+key+"的构造函数运行,当前counter为:"+counter);
}
this.map = map;
} @Override
public void run() {
for (int i = 1; i <= T.NUMBER; i++) {
map.put(key, i);
// System.out.println("线程key为:"+key+"的第"+i+"个run方法运行,设置的i为::"+i);
}
synchronized (lock) {
counter--;//每当往map中put一个值后,计算器减1
// System.out.println("线程key为:"+key+"的run()运行,当前counter为:"+counter);
}
}
}
/**
* get线程类
* @author shunyang
* @date 2015年3月6日 下午4:24:52
*/
class MapGetThread extends Thread { static int counter = 0;
static final 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;
} @Override
public void run() {
for (int i = 1; i <= T.NUMBER; i++) {
map.get(key);
}
synchronized (lock) {
counter--;
}
}
}
当每次启动100个线程,每个线程往map中塞100个数据的时候,结果:

当每次启动1000个线程,每个线程往map中塞1000个数据的时候,结果:

当每次启动10000个线程,每个线程往map中塞10000个数据的时候,结果:

结论:当线程越多时,
ConcurrentHashMap的性能比同步的HashMap快一倍左右
同步的HashMap和Hashtable的性能相当
测试HashTable、Collections.synchronizedMap和ConcurrentHashMap的性能的更多相关文章
- Collections.synchronizedMap()、ConcurrentHashMap、Hashtable之间的区别
为什么要比较Hashtable.SynchronizedMap().ConcurrentHashMap之间的关系?因为常用的HashMap是非线程安全的,不能满足在多线程高并发场景下的需求. 那么为什 ...
- Hashtable、synchronizedMap、ConcurrentHashMap 比较
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp18 Hashtable.synchronizedMap.Concurren ...
- Collections.synchronizedMap()与ConcurrentHashMap的区别
前面文章提到Collections.synchronizedMap()与ConcurrentHashM两者都提供了线程同步的功能.那两者的区别在哪呢?我们们先来看到代码例子. 下面代码实现一个线 ...
- Collections.synchronizedMap()与ConcurrentHashMap区别
Collections.synchronizedMap()与ConcurrentHashMap主要区别是:Collections.synchronizedMap()和Hashtable一样,实现上在调 ...
- Java容器:HashTable, synchronizedMap与ConcurrentHashMap
首先需要明确的是,不管使用那种Map,都不能保证公共混合调用的线程安全,只能保证单条操作的线程安全,在这一点上各Map不存在优劣. 前文中简单说过HashTable和synchronizedMap,其 ...
- ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点
ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...
- HashTable、HashMap、ConcurrentHashMap、Collections.synchronizedMap()区别
Collections.synchronizedMap()和Hashtable一样,实现上在调用map所有方法时,都对整个map进行同步,而ConcurrentHashMap的实现却更加精细,它对Ha ...
- ConcurrentHashMap vs Collections.synchronizedMap()不同
之前项目中,有用到过Collections.synchronizedMap(),后面发现当并发数很多的时候,出现其他请求等待情况,因为synchronizedMap会锁住所有的资源,后面通过查阅资料, ...
- Map m = Collections.synchronizedMap(new HashMap())
Collections.synchronizedMap(new HashMap())让你创建的new HashMap()支持多线程数据的同步.保证多线程访问数据的一致性 来源:http://www.b ...
随机推荐
- 修改 dll
由于没有源码,想改dll,就要依靠反汇编了. 输入 ildasm.exe 据说也可以直接 C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin 找到该软件 ...
- Set Matrix Zeroes -- LeetCode
原题链接: http://oj.leetcode.com/problems/set-matrix-zeroes/ 这是一个矩阵操作的题目,目标非常明白,就是假设矩阵假设有元素为0,就把相应的行和列上面 ...
- 使用SqlBulkCopy导入数据至MS SQL Server
原文:使用SqlBulkCopy导入数据至MS SQL Server Insus.NET一直使用表类型来数据入MS SQL Server.参考<存储过程参数为DataTable>http: ...
- Struts2和Struts1的主要区别(完整版)
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Act ...
- NET Web开发
.NET Web开发初学者必知的四个网站 No.1 W3school 链接: http://www.w3school.com.cn/ 预览: 介绍: 全球最大Web前端技术教程网站.内容涵盖从基础 ...
- Wijmo 5 + Ionic Framework之:Hello World!
Wijmo 5 + Ionic Framework之:Hello World! 本教程中,我们用Wijmo 5 和 Ionic Framework实现一个Mobile的工程:Hello World. ...
- ASP.NET中Partial Class部分类
原文:ASP.NET中Partial Class部分类 如果您在开发项目的公用函数库,用于公用函数库的内容越丰富越好,但这不可能一下子就写好,需要一点一点的积累,这时就可以使用Partial Clas ...
- Talend open studio数据导入、导出、同步Mysql、oracle、sqlserver简单案例
推荐大家一个BI工具:talend open studio.我也是刚接触,懂得不多,感觉比较神奇就想大家推荐一下... 由于公司项目,接触了一下BI工具talend,感觉功能很强大, 可以同步多种数据 ...
- [置顶] 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!
前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...
- angularjs + seajs构建Web Form3
angularjs + seajs构建Web Form前端(三) -- 兼容easyui 回顾 在上一章中使用了angular实现了ajax form和树形结构,经过以上两章对于angular的大致使 ...