下面這段代碼存在并發(fā)陷阱???

科技 未結(jié) 2 1681
夜樹
夜樹 2023-06-02 14:38

曾憲杰的《大型網(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ā)陷阱???

2條回答
  •  zzw2888
    zzw2888 (樓主)
    2023-06-02 15:27

    為何換為ConcurrentHashMap之后,還要對add方法進(jìn)行加鎖???

提交回復(fù)