ConcurrenthashMap如何实现并发操作

请教一个问题,

首先在ConcurrenthashMap中预置10万条测试数据

1,我如何使用一个线程对ConcurrenthashMap作操作,先get(key),接着remove(key),直到所有数据remove,记录一下所有时间

2,我如何使用多个线程(3个线程)对ConcurrenthashMap作上面同样的操作,我需要得到两种处理方式所使用的时间

希望能给我简单的demo,谢谢了,小弟线上等待。。。

wshi215
fingerPower 大神啊,昨晚发现这样操作,逻辑有问题啊。三个线程不是并发处理map的,在线程中添加一个计数变量的话,三个线程所处理的数据加起来超过了10W条。。。麻烦你再让我看看
大约 7 年之前 回复

2个回答

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 map;
int which;
public Consumer(ConcurrentHashMap map,int which){
this.map = map;
this.which = which;
}
@Override
public 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 1
The 1 cost 18ms
prepare test data of 10w for 2
The 2 cost 13ms
The 2 cost 14ms
The 2 cost 12ms

prepare test data of 10w for 1
The 1 cost 18ms
prepare test data of 10w for 2
The 2 cost 20ms
The 2 cost 19ms
The 2 cost 16ms

prepare test data of 10w for 1
The 1 cost 18ms
prepare test data of 10w for 2
The 2 cost 14ms
The 2 cost 13ms
The 2 cost 16ms

wshi215
fingerPower 大神啊,昨晚发现这样操作,逻辑有问题啊。三个线程不是并发处理map的,在线程中添加一个计数变量的话,三个线程所处理的数据加起来超过了10W条。。。麻烦你再让我看看
大约 7 年之前 回复
wshi215
fingerPower 大神,非常感谢。不过我运行后,3个线程一直都没出现单个波动,但是3个线程的时间都会一起上下浮动,而且单线程也会有时间浮动。再次感谢大神的帮助,一生平安
大约 7 年之前 回复

你这测试的肯定有问题,ConcurrenthashMap使用的分离锁,多线程不可能比单线程时间还长。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐