我試圖找到一種方法來以原子方式在ConcurrentHashMap
上執行多個操作。原子執行多個操作
我的邏輯是這樣的:
if (!map.contains(key)) {
map.put(key, value);
doSomethingElse();
}
我知道有是putIfAbsent
方法。但是如果我使用它,我仍然無法以原子方式調用doSomethingElse
。
除了訴諸同步/客戶端鎖定之外,還有什麼辦法可以做到嗎?
如果有幫助,在我的情況下,doSomethingElse
會非常複雜,涉及創建和啓動一個線程,查找我們剛剛添加到地圖中的鍵。
所以你想在執行doSomethingElse之前阻止線程訪問映射(並且看到新的鍵)? – assylias 2013-03-19 13:43:12
是的。因爲如果我讓另一個線程在執行'doSomethingElse'之前看到新的鍵值,它可能會調用'doSomethingElse'也會啓動一個單獨的線程。 – adarshr 2013-03-19 13:45:05
但是,如果您使用'putIfAbsent'而不是'if!contains then put',則只有一個投入呼叫會成功 - 這是否解決了爭用? – 2013-03-19 13:46:48