测试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 ...
随机推荐
- 微信公众平台消息接口PHP版开发教程
原文:微信公众平台消息接口PHP版开发教程 一.写好接口程序 在你的服务器上上传好一个接口程序文件,如http://www.yourdomain.com/weixin.php 内容如下: &l ...
- iOS开发---转换坐标系
- (void)viewDidLoad { [super viewDidLoad]; // 蓝色 UIView *blue = [[UIView alloc] init]; blue.backgrou ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 文件夹
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 文件夹 第一部分--開始使用SharePoint 2013 第1章节--SharePoint 2013 介绍 逐渐了解Sh ...
- Spring之使用Annotation注解开发项目
我们也可以使用Annotation来实现注入操作,提高我们写代码的灵活性和效率.spring中要使用annotation,需要在配置文件中增加: <beans xmlns="http: ...
- Oracle执行计划——Oracle 如何启用执行计划
AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计.SQL*Plus AUTOTRACE可以用来替代SQL Trace使用,AUTOTR ...
- MSSQL2008数据库备份还原和数据恢复
原文:MSSQL2008数据库备份还原和数据恢复 序言 一直想写一篇关于数据库备份与恢复的文章,但基于能力的有限对数据库认知的有限怕不足以准确的表达,最后思考很久还是决定把自己的一些理解写出来供大 ...
- JQUERY 插件开发——MENU(导航菜单)
JQUERY 插件开发——MENU(导航菜单) 故事背景:由于最近太忙了,已经很久没有写jquery插件开发系列了.但是凭着自己对这方面的爱好,我还是抽了一些时间来过一下插件瘾的.今天的主题是导航菜单 ...
- Mock原理学习
同事搓蛋问了我一个问题,mock的原理是啥,没怎么想出来,于是花了点时间学习了一下. 从Moq这个库入手:https://github.com/moq/moq4 Moq用到了Castle的库用于Dyn ...
- DbUtility Ex
扩展 DbUtility (1) 2014-05-22 21:48 by Ivony..., 234 阅读, 3 评论, 收藏, 编辑 本文原始路径: https://www.zybuluo.com/ ...
- Visual Studio 换颜色
--- 给 Visual Studio 换颜色 “为革命,保护视力,预防近视,眼保健操开始......” 这个应该是最老版本的眼保健操了,你听过? 一堆废话 且不说上面这个眼保健操到底有木有用,让眼睛 ...