由于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操作。
这种作法易产生同步问题!!! 而且还不如单线程的快!
分享到:
相关推荐
在本文档中,我们关注的是针对【防火墙性能】的测试,特别是【新建并发最大性能】的评估。这涉及到使用专业的测试工具——IXIA测试仪,也被称为BPS测试仪。 在进行性能测试时,首先需要对测试仪进行【基础配置】,...
### Weblogic提高并发处理性能的设置 在现代企业级应用环境中,提高Weblogic服务器的并发处理能力是一项重要的优化措施。本文将详细介绍通过调整Weblogic线程数、设置JDBC缓冲池以及修改`startWeblogic.cmd`文件来...
PHP商品秒杀系统 高并发高性能的极致挑战 完整视频+源码 深入基础技能 Linux / Nginx / Mysql / Redis 基础平台工具,搭配PHP原生代码 不在局限框架选择 掌握系统设计与方法 从需求分析、数据结构创建 到基础功能...
总结来说,这个Java客户端为MongoDB并发访问性能测试提供了一个实用工具,涵盖了查询、修改和插入操作。它利用Java的并发机制和MongoDB的Java驱动,帮助用户评估数据库在高并发环境下的性能。通过分析和优化这个...
为了实现curl高性能,高并发,需要研究如何实现高性能高并发。研究方向有三个。 (1) 长连接。考虑采用长连接的方式去开发。首先研究下长连接和短连接的性能区别。curl内部是通过socket去连接通讯。socket每次连接...
在IT领域,构建高并发高性能服务器是至关重要的技术挑战,特别是在大数据时代,处理大量用户请求、实时数据交换以及保持高效的服务响应成为系统设计的核心。本资料包提供的"高并发高性能服务器"源码提供了深入理解这...
尊天缓存与memcache radis的比较:尊天缓存独有的高并发技术 天生适应高并发高吞吐的服务器环境 性能提升10倍以上 尊天缓存应对大数据量的方法就是使用64位版本 突破32位版本2G的内存限制 总之 并发需求越高 访问量...
PHP秒杀系统 高并发高性能的极致挑战(完整版) 带项目源码
这个压缩包文件包含了进行gRPC并发性能测试的相关资源,让我们逐一解析这些文件来深入理解gRPC的并发特性。 1. **gRPC.docx**:这可能是一个文档,详细解释了如何执行并发测试,包括测试目的、测试环境、测试方法和...
本文将深入探讨如何使用C#实现Socket的高性能和大容量并发处理,并基于提供的完整实例源码进行解析。 首先,Socket是网络通信的基础组件,它为应用程序提供了一种在网络间发送和接收数据的方式。在C#中,我们通常...
这份名为“真实经验性能测试报告模板/并发红包性能测试/性能测试实战项目报告”的文档,聚焦于并发红包功能的性能测试,主要关注的是系统的响应时间、吞吐量以及在不同并发用户数下的稳定性。 1. **测试环境与工具*...
【IIS网站高性能高并发优化解决方案】 随着互联网项目的访问量逐渐增大,对于服务器的性能要求越来越高。在这种情况下,IIS(Internet Information Services)网站的优化显得尤为重要,特别是针对高并发场景。本文...
在研究高性能网络编程并发框架时,本文主要介绍了网络编程的基本概念、并发模型以及Python语言在构建高性能网络服务中的应用。本文将对以下几个知识点进行详细阐述: 1. 网络编程基本概念 网络编程涉及不同计算机或...
本文将提供三种改造方案来解决Impala并发查询缓慢问题,并对每种方案进行测试验证和比较。 解决方案一:将 TIMESTAMP 改为 STRING 类型 在Impala并发查询缓慢问题中,TIMESTAMP 字段类型是导致性能下降的主要原因...
《Berkeley并发性能测试——深度解析与应用》 在计算机科学领域,数据库系统是不可或缺的一部分,而Berkeley DB(简称BDB)作为一种嵌入式数据库系统,因其轻量级、高性能和灵活的数据存储特性,被广泛应用于各种...
PHP秒杀系统 高并发高性能的极致挑战完整版的,分享给大家,一起学习
MySQL大并发量性能优化实战是数据库管理领域中的一个重要主题,特别是在高访问量的互联网应用中。MySQL作为广泛应用的关系型数据库管理系统,其性能优化对于提升系统整体效率至关重要。本篇文章将深入探讨在面对大...
PHP秒杀系统高并发高性能的极致挑战(完整+源码),百度云资源,下载即看