欢迎关注博主公众号:【矿洞程序员】文章由陈晓阳原创。
本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料。
在多线程并发编程中,我们对于共享的数据对象或者是容器会采用线程安全的集合来存储。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 关键字 那么问题就