首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >HashMap 和 concurrentHaspMap 的陷阱与区别

HashMap 和 concurrentHaspMap 的陷阱与区别

作者头像
爱明依
发布于 2019-03-12 15:14:35
发布于 2019-03-12 15:14:35
5700
举报
文章被收录于专栏:爱明依爱明依

在多线程并发编程中,我们对于共享的数据对象或者是容器会采用线程安全的集合来存储。Java中 提供了一些线程安全的容器和对象,有些事支持并发的,java.util.concurrent 包中 有很多这样的类。这种方式的效率会比简单的加互斥锁的实现更好,但是有时通过加锁把使用线程不安全的容器代码改为使用线程安全容器的代码时,会遇到一个陷阱。 在一个使用map 存储信息后 ,统计总数的例子中。 一:map 中的value 整型使用线程不安全的hashMap代码时这样写的。

代码语言:javascript
复制
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 关键字 那么问题就出现了。问题不复杂,大家可以自己来思考答案。

代码语言:javascript
复制
 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统计总数多一。那么问题究竟出现在了那里?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年09月10日,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档