【发布时间】:2021-10-28 06:32:43
【问题描述】:
ConcurrentHashMap<String, Config> configStore = new ConcurrentHashMap<>();
...
void updateStore() {
Config newConfig = generateNewConfig();
Config oldConfig = configStore.get(configName);
if (newConfig.replaces(oldConfig)) {
configStore.put(configName, newConfig);
}
}
ConcurrentHashMap 可以被多个线程读取,但只能由单个线程更新。当put() 操作正在进行时,我想阻止get() 操作。这里的基本原理是,如果put() 操作正在进行,这意味着映射中的当前条目是陈旧的,并且所有get() 操作都应该阻塞,直到put() 完成。在不同步整个地图的情况下,如何在 Java 中实现这一点?
【问题讨论】:
-
您可以使用 java.util.concurrent.locks.ReadWriteLock。但是想想 Map put 操作有多快。你认为这会有什么不同吗?您要准确地避免什么情况?
-
您可能应该使用
compute或其他可以为您解决此问题的 CHM 操作之一 -
“ConcurrentHashMap 可以由多个线程读取,但只能由单个线程更新”您的声明来源在哪里?或者你的意思是 same 条目?
-
"这里的基本原理是,如果 put() 操作正在进行,这意味着 map 中的当前条目是陈旧的,并且所有 get() 操作都应该阻塞,直到 put()是完整的。”这个理由是完全错误的。如果它是正确的,它同样适用于 put() 操作正在进行之前。毕竟,如果某个线程即将调用 put(),那么信息就是陈旧的。因此,如果该论点是合乎逻辑的,则意味着该操作甚至在您调用它之前就应该阻塞,但这显然是不可能的。所以这个理由是不合理的。
标签: java multithreading concurrency hashmap synchronization