曾宪杰的《大型网站系统与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都是线程安全的类,那么这个类是否线程安全。答案显然是否定的。
添加回答
举报
0/150
提交
取消