`
cloudeagle_bupt
  • 浏览: 579068 次
文章分类
社区版块
存档分类
最新评论

ConcurrencyHashMap并发修改性能比较

 
阅读更多

由于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测试新建并发最大性能.docx

    在本文档中,我们关注的是针对【防火墙性能】的测试,特别是【新建并发最大性能】的评估。这涉及到使用专业的测试工具——IXIA测试仪,也被称为BPS测试仪。 在进行性能测试时,首先需要对测试仪进行【基础配置】,...

    Weblogic提高并发处理性能的设置

    ### Weblogic提高并发处理性能的设置 在现代企业级应用环境中,提高Weblogic服务器的并发处理能力是一项重要的优化措施。本文将详细介绍通过调整Weblogic线程数、设置JDBC缓冲池以及修改`startWeblogic.cmd`文件来...

    PHP 高级课程 商品秒杀系统 高并发高性能

    PHP商品秒杀系统 高并发高性能的极致挑战 完整视频+源码 深入基础技能 Linux / Nginx / Mysql / Redis 基础平台工具,搭配PHP原生代码 不在局限框架选择 掌握系统设计与方法 从需求分析、数据结构创建 到基础功能...

    Mongodb的并发访问性能测试的java客户端

    总结来说,这个Java客户端为MongoDB并发访问性能测试提供了一个实用工具,涵盖了查询、修改和插入操作。它利用Java的并发机制和MongoDB的Java驱动,帮助用户评估数据库在高并发环境下的性能。通过分析和优化这个...

    libcurl长连接高并发高性能封装测试分析源代码

    为了实现curl高性能,高并发,需要研究如何实现高性能高并发。研究方向有三个。 (1) 长连接。考虑采用长连接的方式去开发。首先研究下长连接和短连接的性能区别。curl内部是通过socket去连接通讯。socket每次连接...

    高并发高性能服务器

    在IT领域,构建高并发高性能服务器是至关重要的技术挑战,特别是在大数据时代,处理大量用户请求、实时数据交换以及保持高效的服务响应成为系统设计的核心。本资料包提供的"高并发高性能服务器"源码提供了深入理解这...

    尊天缓存,高并发高性能,让服务器飞起来

    尊天缓存与memcache radis的比较:尊天缓存独有的高并发技术 天生适应高并发高吞吐的服务器环境 性能提升10倍以上 尊天缓存应对大数据量的方法就是使用64位版本 突破32位版本2G的内存限制 总之 并发需求越高 访问量...

    PHP秒杀系统 高并发高性能的极致挑战(完整版)

    PHP秒杀系统 高并发高性能的极致挑战(完整版) 带项目源码

    gRPC并发性能测试代码

    这个压缩包文件包含了进行gRPC并发性能测试的相关资源,让我们逐一解析这些文件来深入理解gRPC的并发特性。 1. **gRPC.docx**:这可能是一个文档,详细解释了如何执行并发测试,包括测试目的、测试环境、测试方法和...

    C#实现Socket高性能、大容量并发(附完整实例源码)

    本文将深入探讨如何使用C#实现Socket的高性能和大容量并发处理,并基于提供的完整实例源码进行解析。 首先,Socket是网络通信的基础组件,它为应用程序提供了一种在网络间发送和接收数据的方式。在C#中,我们通常...

    真实经验性能测试报告模板/并发红包性能测试/性能测试实战项目报告

    这份名为“真实经验性能测试报告模板/并发红包性能测试/性能测试实战项目报告”的文档,聚焦于并发红包功能的性能测试,主要关注的是系统的响应时间、吞吐量以及在不同并发用户数下的稳定性。 1. **测试环境与工具*...

    IIS网站高性能高并发优化解决方案

    【IIS网站高性能高并发优化解决方案】 随着互联网项目的访问量逐渐增大,对于服务器的性能要求越来越高。在这种情况下,IIS(Internet Information Services)网站的优化显得尤为重要,特别是针对高并发场景。本文...

    Python高性能网络编程并发框架研究.pdf

    在研究高性能网络编程并发框架时,本文主要介绍了网络编程的基本概念、并发模型以及Python语言在构建高性能网络服务中的应用。本文将对以下几个知识点进行详细阐述: 1. 网络编程基本概念 网络编程涉及不同计算机或...

    Impala并发查询缓慢问题解决方案.docx

    本文将提供三种改造方案来解决Impala并发查询缓慢问题,并对每种方案进行测试验证和比较。 解决方案一:将 TIMESTAMP 改为 STRING 类型 在Impala并发查询缓慢问题中,TIMESTAMP 字段类型是导致性能下降的主要原因...

    Berkeley并发性能测试

    《Berkeley并发性能测试——深度解析与应用》 在计算机科学领域,数据库系统是不可或缺的一部分,而Berkeley DB(简称BDB)作为一种嵌入式数据库系统,因其轻量级、高性能和灵活的数据存储特性,被广泛应用于各种...

    PHP秒杀系统 高并发高性能的极致挑战完整版的-可以解压的

    PHP秒杀系统 高并发高性能的极致挑战完整版的,分享给大家,一起学习

    MySQL大并发量性能优化实战

    MySQL大并发量性能优化实战是数据库管理领域中的一个重要主题,特别是在高访问量的互联网应用中。MySQL作为广泛应用的关系型数据库管理系统,其性能优化对于提升系统整体效率至关重要。本篇文章将深入探讨在面对大...

    PHP秒杀系统高并发高性能的极致挑战(完整+源码)

    PHP秒杀系统高并发高性能的极致挑战(完整+源码),百度云资源,下载即看

Global site tag (gtag.js) - Google Analytics