java - 一个并发集合位于另一个集合中 : is it thread safe

标签 java collections dictionary concurrency

[问题]:使用 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/

相关文章:

C++ - 迭代 vector 的替代方法

arrays - 按键对字典进行排序并将其转换为数组

java - 文件下载 SSLHandshakeException

java - 如何使用 Maven 设置 Liquibase?

c# - 反序列化集合时未调用 Setter

java - 树形图和字节[]

java - 切换到 Map/Enum 或其他

java - Libgdx 角色运行动画未显示

java - 使用java从url复制图像

java - 无法在 Java 中使用 List 类进行向下转换