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

曾宪杰的《大型网站系统与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之后,原书中说存在并发陷阱???


料青山看我应如是
浏览 589回答 2
2回答

互换的青春

ConcurrentHashMap只保证在并发情况下其内部数据能够保持一致,而这一点HashMap是做不到的。但是add方法并不是线程安全,因为这是一个典型的Check-Then-Act或者Read-Modify-Write。你可以思考这样一个问题,如果一个类里的所有field都是线程安全的类,那么这个类是否线程安全。答案显然是否定的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java