曾憲杰的《大型網(wǎng)站系統(tǒng)與Java中間件實(shí)踐》第一章第1.2.2.3小節(jié)給出以下代碼示例:
使用HashMap
數(shù)據(jù)被進(jìn)行統(tǒng)計;
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
保存數(shù)據(jù)并進(jìn)行統(tǒng)計;
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之后,原書中說存在并發(fā)陷阱???