[问题]:使用 ConcurrentHashMap<Object, ConcurrentHashMap<Object, Object>>
线程安全吗?或不。
[可选回答]:其他并发 map 类型又如何?那么并发集合又如何呢?
P.S. 我只询问 java.util.concurrent
包。
特定使用上下文:
//we have
ConcurrentHashMap<Object, ConcurrentHashMap<Object, Object>> map = new ConcurrentHashMap<Object, ConcurrentHashMap<Object, Object>>();
//each string can be executed separately and concurently
ConcurrentHashMap<Object, Object> subMap = new ConcurrentHashMap<Object, Object>()
map.put(key, subMap);
map.remove(key);
map.get(key);
map.get(key).put(key, ref);
map.get(key).remove(key);
也许我的解决方案围绕 Guava HashBasedTable?
最佳答案
如果没有计划使用集合的特定上下文,您就无法定义线程安全性。
您命名的并发集合本身是线程安全的,因为它们的内部不变量不会被并发访问破坏;然而,这只是线程安全检查表上的一个要点。
如果您对结构执行的操作超过单个操作(整个结构必须是原子的),那么仅通过使用这些类将无法获得线程安全性。您将不得不求助于经典的锁定,或者一些非常复杂的、通常没有动机的无锁更新方案。
使用您问题中的示例,考虑以下内容。
线程1执行
map.get(mapKey).put(key, value);
同时,线程2执行
map.remove(mapKey);
结果如何?线程 1 可能正在向已删除的 map 添加某些内容,或者甚至可能从 get
获得 null
结果。在大多数情况下,需要更多的协调才能保证正确性。
关于java - 一个并发集合位于另一个集合中 : is it thread safe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22042750/