您的位置:首页 > 编程语言 > ASP

HashMap 和 concurrentHaspMap 的陷阱与区别

2017-09-10 17:39 615 查看
在多线程并发编程中,我们对于共享的数据对象或者是容器会采用线程安全的集合来存储。Java中 提供了一些线程安全的容器和对象,有些事支持并发的,java.util.concurrent 包中 有很多这样的类。这种方式的效率会比简单的加互斥锁的实现更好,但是有时通过加锁把使用线程不安全的容器代码改为使用线程安全容器的代码时,会遇到一个陷阱。

在一个使用map 存储信息后 ,统计总数的例子中。

一:map 中的value 整型使用线程不安全的hashMap代码时这样写的。

private HashMap<String,Integer> map=
new HashMap<String, Integer>();
public synchronized  void add1(String key){
Integer value=map.get(key);
if(value==null){
map.put(key,1);
}else{
map.put(key,value+1);
}
}


二:使用concurrentHashMap 来替换hashMap 并且是仅仅去掉synchronized 关键字 那么问题就出现了。问题不复杂,大家可以自己来思考答案。

private ConcurrentHashMap<String,Integer> conMap=
new ConcurrentHashMap<String, Integer>();

public void add2(String key){
Integer value=conMap.get(key);
if(value==null){
conMap.put(key,1);
}else{
conMap.put(key,value+1);
}

}


会出现使用concurrentHashMap 统计的总数 永远比使用hashMap统计总数多一。那么问题究竟出现在了那里?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息