ConcurrenthashMap如何实现并发操作

问题描述

请教一个问题,首先在ConcurrenthashMap中预置10万条测试数据1,我如何使用一个线程对ConcurrenthashMap作操作,先get(key),接着remove(key),直到所有数据remove,记录一下所有时间2,我如何使用多个线程(3个线程)对ConcurrenthashMap作上面同样的操作,我需要得到两种处理方式所使用的时间希望能给我简单的demo,谢谢了,小弟线上等待。。。 问题补充:求帮忙!!!

解决方案

public class ConcurrentHashMapTest {/** * @param args * @throws InterruptedException */public static void main(String[] args) throws InterruptedException {ConcurrentHashMap<Integer,String> map = new ConcurrentHashMap<Integer,String>();for(int i=0;i<10*10000;i++){map.put(i, String.valueOf(i));}System.out.println("prepare test data of 10w");new Consumer(map,1).start();Thread.sleep(1000);ConcurrentHashMap<Integer,String> map1 = new ConcurrentHashMap<Integer,String>();for(int i=0;i<10*10000;i++){map1.put(i, String.valueOf(i));}for(int i=0;i<3;i++){new Consumer(map1,2).start(); }}}class Consumer extends Thread{ConcurrentHashMap<Integer,String> map;int which;public Consumer(ConcurrentHashMap<Integer,String> map,int which){this.map = map;this.which = which;}@Overridepublic void run() {long start = System.currentTimeMillis();for(Integer key : map.keySet()){map.get(key);map.remove(key);}System.out.println("The "+which+" cost "+(System.currentTimeMillis()-start)+"ms");}}执行三次,发现单线程性能cost比较稳定,3个线程会有波动,按照最长时间的线程来看,有可能性能还不如single的,可见concurrenthashmap对于同步处理还是有一定的开销的prepare test data of 10w for 1The 1 cost 18msprepare test data of 10w for 2The 2 cost 13msThe 2 cost 14msThe 2 cost 12msprepare test data of 10w for 1The 1 cost 18msprepare test data of 10w for 2The 2 cost 20msThe 2 cost 19msThe 2 cost 16msprepare test data of 10w for 1The 1 cost 18msprepare test data of 10w for 2The 2 cost 14msThe 2 cost 13msThe 2 cost 16ms
解决方案二:
你这测试的肯定有问题,ConcurrenthashMap使用的分离锁,多线程不可能比单线程时间还长。

时间: 2024-11-05 20:32:30

ConcurrenthashMap如何实现并发操作的相关文章

httpclient模拟登入 多用户登入并发操作怎么解决

问题描述 httpclient模拟登入 多用户登入并发操作怎么解决 .最近写了一个模拟登陆集大教务处获取成绩的页面,但是只能一个用户登入,如果另外一个用户登入了 ,前一个用户查出来的成绩就是后一个用户的. httpclient有提供相关策略吗? 该如何解决呢 万谢! 求不要告诉我带上cookie 我试过了 带上也没用 一个httpclient相当于一个浏览器 你第一个用户获取的cookie和第2个用户获取的cookie是一样的 谢谢~ 解决方案 可以禁用httpclient的保持会话的功能,自己

c#写怎么防止并发操作(一个要删文件,一个要读文件)?

问题描述 c#写怎么防止并发操作(一个要删文件,一个要读文件)? c#写web后台文件和数据库操作,怎么防止并发操作(一个要删文件,一个要读文件)? 解决方案 你读文件的时候指定FileShare.Read,你删除的时候就会收到一个异常,不允许删除. 你在读文件的时候除非读完,不要Close文件,就可以了. https://msdn.microsoft.com/zh-cn/library/system.io.fileshare(VS.80).aspx

MFC消息传递实现伪并发操作的问题

问题描述 MFC消息传递实现伪并发操作的问题 有关MFC定时器消息的伪并发操作,对于不同类型的消息,使用不同的函数处理,那么对于相同的消息,怎么进行处理呢? 解决方案 相同的消息就是由同一个消息处理函数来处理了. 解决方案二: 自动实现一个事件分发,需要处理事件时就添加处理器,就像web中的addEventListener一样

redis 并发操作引起的问题

问题描述 虽然Redis官方说redis是单线程的,而且所有的操作都是原子性的,但是在不同的并发量下发出请求,最后的结果并不如所料.大家讨论一下...age默认值是0,在100,10000,100000并发下@TestpublicvoidmultiThreadIncrease(){ExecutorServiceexecutorService=Executors.newCachedThreadPool();for(inti=0;i<10000;i++){executorService.submit

java 集合并发操作出现的异常ConcurrentModificationException_java

如Java中的容器Map: for(Person person : pList){ if(person.getGender()==Gender.MALE){ pList.remove(person); //不能在遍历期间进行 remove这个操作 } } Map在遍历时候通常 现获得其键值的集合Set,然后用迭代器Iterator来对Map进行遍历. 注意在遍历的过程中,只能对Map中的元素进行相应的处理,不能把Map元素增加或者把Map元素减少,也就是说,不能改变Map的size大小,就会出现

hadoop map-reduce中的文件并发操作_数据库其它

这样的操作在map端或者reduce端均可.下面以一个实际业务场景中的例子来简要说明. 问题简要描述: 假如reduce输入的key是Text(String),value是BytesWritable(byte[]),不同key的种类为100万个,value的大小平均为30k左右,每个key大概对应 100个value,要求对每一个key建立两个文件,一个用来不断添加value中的二进制数据,一个用来记录各个value在文件中的位置索引.(大量的小文件会影响HDFS的性能,所以最好对这些小文件进行

PHP并发操作下的加锁

最近做后台统计的工具,统计肯定是一个需要运算好久的数据 容许一个用户在一个时间内进行操作,这个时候就需要用到锁了,将这个操作过程锁起来.在用了cache的时候,cache失效可能导致瞬间的多数并发请求穿透到数据库此时也可以得需要用锁在同一并发的过程中将这个操作锁定 你也可以改用XCache 来写 <?php /** * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库 * 用于解决PHP在并发时候的锁控制,通过文件/eacceler

并发操作Windows Vista新增的同步原语

本文讨论: 条件变量 Slim 读取器锁/写入器锁 一次性初始化 仔细查过锁定 本文使用了以下技术: Windows Vista, C++ 目录 条件变量 Slim 读取器锁/写入器锁 一次性初始化 结束语 Windows Vista 附带了一系列面向开发人员的令人振奋的新技术,包括 Windows Presentation Foundation.Windows Communication Foundation 和 Windows Workflow Foundation.事实上,Windows

并发操作-a,b两个请求并发 注册相同用户名,假如表中字段未设置唯一索引,程序上如何控制唯一性啊

问题描述 a,b两个请求并发 注册相同用户名,假如表中字段未设置唯一索引,程序上如何控制唯一性啊 a,b同时查询表,结果是可以注册的,所以都执行了insert,但用户名相同,这样数据就不唯一了.是会这样吗,如何避免呢? 解决方案 把查询和插入放在同一事务中,可以保证整个事务中数据库数据的一致性,这样应该可以避免你说的问题. 上述并发一起的问题,根源在于查询与插入两个时间点数据库数据不一致导致. 解决方案二: 必须有有个不同的key,比如你可以增加一个字段,为userid,这个不会变,但用户名可以