由于ConcurrecyHashMap允许并发修改,无需加锁,因此测试其性能
package concurrencyTest;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrencyReadTest {
/**
* @param args
*/
public static void main(String[] args) {
ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<Integer, Integer>() ;
for(int i=0;i<100000 ; i++)
map.put(i, i+111111) ;
long start = System.currentTimeMillis() ;
Thread t1 = new Thread(new Worker(map)) ;
Thread t2 = new Thread(new Worker(map)) ;
t1.start();
t2.start();
try {
t1.join() ;
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Read last : " + (System.currentTimeMillis() - start) + " ms");
}
}
class Worker implements Runnable {
ConcurrentHashMap<Integer, Integer> sharemap ;
int num = 0 ;
public Worker(ConcurrentHashMap<Integer, Integer> map) {
sharemap = map ;
}
@Override
public void run() {
it = sharemap.values().iterator();
Integer i = poll();
while(i!=null) {
i = poll() ;
num++ ;
}
System.out.println("poll " + num + " elements!");
}
Iterator<Integer> it;
public Integer poll() {
if (sharemap.size() > 0 && it!=null && it.hasNext()) {
Integer m = it.next();
it.remove();
return m;
} else {
return null;
}
}
}
100000数据
并发读取
47
62
56
单独读取
31
47
47
1000000数据
281
297
281
单独读取
171
172
171
可见还是顺序读取较快! ConcurrentHashMap使用了segment 分段加锁,但是效率还是有一定损失!
但是这里存在的问题是, 并发修改时,两个线程读取的每个map都不一样,造成重复读取,执行双线程读取时,结果是:
poll 99415 elements!
poll 97851 elements!
Read last : 47 ms
但是实际一共只有100000 元素,因此无法保证同步性, 就像这篇文章说的:
http://www.cnblogs.com/zhuawang/p/4779649.html
Iterator对象的使用,不一定是和其它更新线程同步,获得的对象可能是更新前的对象,ConcurrentHashMap允许一边更新、一边遍历,也就是说在Iterator对象遍历的时候,ConcurrentHashMap也可以进行remove,put操作,且遍历的数据会随着remove,put操作产出变化,所以希望遍历到当前全部数据的话,要么以ConcurrentHashMap变量为锁进行同步(synchronized该变量),要么使用CopiedIterator包装iterator,使其拷贝当前集合的全部数据,但是这样生成的iterator不可以进行remove操作。
这种作法易产生同步问题!!! 而且还不如单线程的快!
分享到:
相关推荐
使用BPS测试仪对防火墙进行新建并发最大性能值测试,及输出对应的报告
Weblogic提高并发处理性能的设置 对于1. 设置Weblogic线程数 2. 设置Weblogic JDBC 缓冲池 4. 修改 startWeblogic.cmd 文件
PHP商品秒杀系统 高并发高性能的极致挑战 完整视频+源码 深入基础技能 Linux / Nginx / Mysql / Redis 基础平台工具,搭配PHP原生代码 不在局限框架选择 掌握系统设计与方法 从需求分析、数据结构创建 到基础功能...
为了实现curl高性能,高并发,需要研究如何实现高性能高并发。研究方向有三个。 (1) 长连接。考虑采用长连接的方式去开发。首先研究下长连接和短连接的性能区别。curl内部是通过socket去连接通讯。socket每次连接...
MySQL大并发量性能优化实战 MySQL大并发量性能优化实战 MySQL大并发量性能优化实战 MySQL大并发量性能优化实战 仅供个人学习, 禁止转载及其他商业用途.
尊天缓存与memcache radis的比较:尊天缓存独有的高并发技术 天生适应高并发高吞吐的服务器环境 性能提升10倍以上 尊天缓存应对大数据量的方法就是使用64位版本 突破32位版本2G的内存限制 总之 并发需求越高 访问量...
PHP秒杀系统 高并发高性能的极致挑战(完整版) 带项目源码
高并发 高性能服务器源码,供大家学习参考!
系统并发压力性能测试报告.pdf系统并发压力性能测试报告.pdf系统并发压力性能测试报告.pdf系统并发压力性能测试报告.pdf系统并发压力性能测试报告.pdf
主要介绍badboy + jmeter并发性能测试,及badboy的使用
IIS网站高性能高并发优化解决方案,通过修改IIS配置结合window定时任务优化IIS下网站的高并发访问性能
PHP秒杀系统 高并发高性能的极致挑战完整版的,分享给大家,一起学习
PHP秒杀系统高并发高性能的极致挑战(完整+源码),百度云资源,下载即看
C#高性能大容量SOCKET并发项目C#高性能大容量SOCKET并发项目C#高性能大容量SOCKET并发项目C#高性能大容量SOCKET并发项目C#高性能大容量SOCKET并发项目C#高性能大容量SOCKET并发项目C#高性能大容量SOCKET并发项目C#高...
Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行模式 Tomcat的运行模式有3种。 1.bio模式 默认的模式,性能非常...
这个客户端实现了对mongoDB数据库的并发访问及访问性能测试。包括查询,修改和插入性能。用户使用该客户端的时候需要修改mongodb的ip地址和端口号,以及数据库名称和collection名称。
纯自己的供工作实战,非网络下载,仅供参考! 真实经验性能测试报告模板/并发红包性能测试/性能测试实战项目报告
PHP秒杀系统 高并发高性能的极致挑战(完整版)- 解压不需要解压密码 带项目源码
高并发应用性能调优与实践交流 什么是高并发应用 架构设计 系统优化思路 资源争用解决方案 系统调优实践
如何利用Java开发高性能、高并发Web应用