首页 > 解决方案 > 使用多线程时我们是否应该始终使用 ConcurrentHashMap?

问题描述

如果我有一个哈希映射和这个方法:

private Map<String, String> m = new HashMap<>();

private void add(String key, String value) {
    String val = m.get(key);
    if (val == null) {
        m.put(key, value);
    }
}

如果我有两个线程 A 和 B 调用具有相同键和值的方法,A 和 B 可能都看到键不在映射中,因此可能同时写入映射。但是,写入顺序(A 在 B 之前或 B 在 A 之前)不应影响结果,因为它们都写入相同的值。但我只是想知道并发写入是否会很危险并可能导致意想不到的结果。在那种情况下,我可能应该使用 ConcurrentHashMap。

标签: javaconcurrency

解决方案


是的,你应该使用 a ConcurrentHashMap(它是内部线程安全的),并使用m.putIfAbsent(key, value)它。

m也应该是final,以避免它被重新分配。


推荐阅读