所以这是实施..
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);
}
看起来线程安全
感谢您的任何澄清
答案 0 :(得分:0)
在ConcurrentHashMap
方法中,即使不需要,也始终会创建新的put
。这很浪费。
此外,在putIfAbsent
方法中,如果另一个帖子可以删除地图键,则可以在get
和NullPointerException
调用之间删除嵌套地图,从而导致{{ 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);
}