【发布时间】:2013-03-19 13:38:16
【问题描述】:
我正在尝试找到一种方法以原子方式对 ConcurrentHashMap 执行多个操作。
我的逻辑是这样的:
if (!map.contains(key)) {
map.put(key, value);
doSomethingElse();
}
我知道有putIfAbsent 方法。但是如果我使用它,我仍然无法以原子方式调用doSomethingElse。
除了诉诸同步/客户端锁定之外,还有什么方法可以做这些事情吗?
如果有帮助,在我的例子中,doSomethingElse 会非常复杂,涉及创建和启动一个线程来查找我们刚刚添加到地图中的键。
【问题讨论】:
-
所以你想在
doSomethingElse被执行之前阻止线程访问映射(并看到新的键)? -
是的。因为,如果我在执行
doSomethingElse之前让其他线程看到新密钥,它可能也会调用doSomethingElse,这将启动一个单独的线程。 -
但是如果你使用
putIfAbsent而不是if !contains then put,那么只有一个put call会成功——这能解决争用吗? -
@SteveTownsend 我认为你可能有一个有效的观点!
-
可以使用类似a lock-free memoizer 的模式吗?您可能有一个
ValueHolder类来保存值和计算。在 putIfAbsent 之后,您可以开始计算(如果它已经运行,则不会执行任何操作)。
标签: java multithreading concurrency