2016-05-27 22 views
0

如果我們想允許在concuurentHashMap中用putIFAbsent的兩個不同線程覆蓋值,該怎麼辦?如果我們想允許在concuurentHashMap中用putIFAbsent覆蓋值,該怎麼辦?

說我在我的併發哈希映射中有字符串鍵,字符串值1和字符串值2,並說我想允許通過兩個不同的線程覆蓋同一個鍵的值。我需要一個循環嗎?

public insertCarefullyIntoMap(String key, value) { 
    while(value != putIfAbsent(key,value)){} 
} 
+0

http://stackoverflow.com/questions/10486413/concurrenthashmap-put-vs-putifabsent – Helios

+0

該帖子確實沒有說明如何在concurrentHashMap中對同一個鍵的值進行安全覆蓋。 – user1870400

+0

我已經給出了你問的原始問題的鏈接。 – Helios

回答

1

put功能仍然有效,像正常的 - 事實上,Java文檔用它來形容putIfAbsent的行爲:如果指定鍵已經不再與某個值相關

,關聯它與給定的價值。這相當於

if (!map.containsKey(key)) 
    return map.put(key, value); 
else 
    return map.get(key); 

除了該操作是自動執行的。

所以,如果你不關心鍵是否已經存在於HashMap,那麼你可以只是把無條件的價值:

public insertCarefullyIntoMap(String key, String value) { 
    map.put(key, value); 
} 

唯一約束與put功能是,無論是鍵和值不能爲空。

+0

我正在尋找Put和putIfAbsent在多線程案例中的區別 – user1870400

+0

putIfAbsent的第一個線程將獲勝,另一個線程將僅獲取該值,因爲該鑰匙不再缺失。如果你不想要這種行爲,只需使用put方法即可。 – dunni

+0

您也可以查看替換方法。替換將檢查密鑰的舊值,只有匹配時,它纔會更新密鑰的值。也許這更符合你的要求。 – dunni

相關問題