为了账号安全,请及时绑定邮箱和手机立即绑定

下面这段代码存在并发陷阱???

下面这段代码存在并发陷阱???

料青山看我应如是 2019-03-14 14:15:58
曾宪杰的《大型网站系统与Java中间件实践》第一章第1.2.2.3小节给出以下代码示例:使用HashMap数据被进行统计;public class TestClass{    private HashMap<String, Integer> map = new HashMap<>();        public synchronized void add(String key)    {        Integer value = map.get(key);        if(value == null)        {            map.put(key, 1);        }        else        {            map.put(key, value + 1);        }    } }使用ConcurrentHashMap保存数据并进行统计;public class TestClass{    private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();        public void add(String key)    {        Integer value = map.get(key);        if(value == null)        {            map.put(key, 1);        }        else        {            map.put(key, value + 1);        }    } }使用HashMap时,对add方法加锁,此时该方法是线程安全的,为何换为ConcurrentHashMap之后,原书中说存在并发陷阱???
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

ConcurrentHashMap只保证在并发情况下其内部数据能够保持一致,而这一点HashMap是做不到的。

但是add方法并不是线程安全,因为这是一个典型的Check-Then-Act或者Read-Modify-Write

你可以思考这样一个问题,如果一个类里的所有field都是线程安全的类,那么这个类是否线程安全。答案显然是否定的。


查看完整回答
反对 回复 2019-04-25
  • 2 回答
  • 0 关注
  • 588 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信