【发布时间】:2022-01-21 16:51:07
【问题描述】:
我需要添加一个静态线程安全的 HashMap。我有这样的东西-
private static Map<String, ConcurrentHashMap<Integer, ClassA>> myCache =
new ConcurrentHashMap<String, ConcurrentHashMap<Integer, ClassA>>();
即使我使用 ConcurrentHashMap,我看到如果主线程正在 myCache 中添加元素,并且即使稍后在其他线程中访问相同的元素,它也没有最新的myCache 对象中的数据。例如
线程 1:向地图添加条目
myCache = {a1={1=com.x.y.z.ClassA@3ec8b657}}
线程 2:访问相同的密钥 a1。但它没有看到线程 1 添加的数据。而是看到此键 myCache = {a1={}} 的空值
结果,数据被破坏。为线程 1 中的 a1 键添加的条目在线程 2 中不可见。
提前感谢有关如何以线程安全方式更新此映射的任何指示。
【问题讨论】:
-
请出示minimal reproducible example,说明您当前如何更新和阅读地图。
-
@Ryan 的答案是实现您想要的目标的好方法。请注意,您实现的类不一定扩展 Map。新类必须代理您希望使用的所有 Map 方法(putAll、clear 等)。
标签: java multithreading concurrenthashmap