我試圖追蹤競賽狀況,所有跡象似乎都指向ConcurrentHashMap.putIfAbsent()
。是否有可能,如果兩個線程在具有相同密鑰的空映射上調用putIfAbsent()
,這兩個線程都可以通過查找來查看密鑰不存在,那麼兩個線程都會嘗試添加它?由於某種原因,當我第一次開始使用putIfAbsent()
時,我並不認爲這個調用需要同步。但是現在我看不出它是如何防止兩個線程在時機正確的情況下添加它們的值。我無法在生產之外重現這一點。需要使用同步操作的任何併發收集java.util.concurrent.ConcurrentHashMap.putIfAbsent是否需要在同步塊中?
感謝
你能發佈一個代碼片段嗎?細節決定成敗。 – Tudor