测试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 ...
随机推荐
- Java用ZIP格式压缩和解压缩文件
转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...
- jQuery基础---Ajax进阶
原文:jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处! 在 Ajax 基础一 ...
- 我的时间,GTD做主
可能每一次总结的时候,我们都在努力的回顾,我这几天都干了什么,结果回顾半天得到的结果就是:我也不知道,仿佛什么都没有做似的.事实上不然,你已经做了好多事,但却始终有这样的感觉,有的时候都在自己发问:我 ...
- Codeforces 474A Keyboard (水
题目链接:点击打开链接 键盘移位了,问输出相应的字母 #include <cstdio> #include <cstring> char a[105]; char b[3][1 ...
- POJ 1201 && HDU 1384 Intervals(差动制动系统)
职务地址:POJ 1201 HDU 1384 依据题目意思.能够列出不等式例如以下: Sj-Si>=c; Si-S(i-1)>=0; S(i-1)-Si>=-1; 然后用最短路s ...
- Nancy入门
Nancy入门 当我们要接到一个新的项目的时候,我们第一时间想到的是用微软的MVC框架,但是你是否想过微软的MVC是不是有点笨重?我们这个项目用MVC是不是有点大材小用?有没有可以替代MVC的东西呢? ...
- Spring IOC 之Bean定义的继承
一个Bean的定义可以包含大量的配置信息,包括构造器参数.属性值以及容器规范信息,比如初始化方法.静态工厂方法名字等等.一子bean的定义可以从父bean的定义中继承配置数据信息.子bean定义可以覆 ...
- openwrt的GPIO控制
为什么有些GPIO可以在/sys/class/gpio中控制,而有些不行呢? 先来看一看普通不需要C程序而是使用脚本的控制方法(Linux普遍适用): First step is making GPI ...
- leetcode第31题--Longest Valid Parentheses
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- 专业MySQL数据库管理专家SQL Manager for MySQL发布5.4版本
SQL Manager for MySQL是一款针对MySQL数据库服务器系统的管理工具.深受数据库管理员的喜欢,其富有艺术感的图形用户界面,即使新手也可以不会为如何使用而感到困扰.近日EMSSoft ...