Java嵌套的ConcurrentHashMap是线程安全的吗?

时间:2017-12-28 20:21:32

标签: java multithreading hashmap thread-safety

所以这是实施..

public ConcurrentMap<String , ConcurrentMap<String, Object>> map = new ConcurrentHashMap<>();

public void put(String subKey, String key, Object value) {
    map.putIfAbsent(subKey, new ConcurrentHashMap<>());
    map.get(subKey).put(key, value);
}

public Object get(String subKey, String key) {
    return map.get(subKey) == null ? null : map.get(subKey).get(key);
}

看起来线程安全

  • PutIfAbsent是原子操作。
  • 然后得到内部地图,推出值也应该是线程安全的,正如我想的那样。

感谢您的任何澄清

1 个答案:

答案 0 :(得分:0)

ConcurrentHashMap方法中,即使不需要,也始终会创建新的put。这很浪费。

此外,在putIfAbsent方法中,如果另一个帖子可以删除地图键,则可以在getNullPointerException调用之间删除嵌套地图,从而导致{{ 1}}。请改用computeIfAbsent

public void put(String subKey, String key, Object value) {
    map.computeIfAbsent(subKey, k -> new ConcurrentHashMap<>())
       .put(key, value);
}

get方法中,您不应该两次调用get,因为该值可能会在第一次和第二次调用之间发生变化。保存值是一个变量:

public Object get(String subKey, String key) {
    ConcurrentMap<String, Object> subMap = map.get(subKey);
    return subMap == null ? null : subMap.get(key);
}