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

问题描述 投票:0回答:1

所以这是实施..

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是原子操作。
  • 然后得到内部地图和推杆值也应该是线程安全的,正如我想的那样。

谢谢你的任何澄清

java multithreading
1个回答
0
投票

put方法中,你总是创造一个新的ConcurrentHashMap,即使它不需要。这很浪费。

此外,在put方法中,如果地图键可以被另一个线程删除,则可以在putIfAbsentget调用之间移除嵌套地图,从而导致NullPointerException。使用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);
}
© www.soinside.com 2019 - 2024. All rights reserved.