我正在使用putIfAbsent將值添加到ConcurrentHashMap中,如果它們不作爲原子操作存在的話。判斷putIfAbsent是否修改了ConcurrentHashMap的正確方法是什麼?
這一切看起來都不錯,但我真的可以確定是否真的添加了新對象。
我最好的想法是檢查putIfAbsent的返回值是否爲null,看起來像它應該工作,只要我們從不將null值放入映射中(但ConcurrentHashMap不允許),但我是想知道是否有我錯過的東西。或者這是做到這一點的正確方法?
我正在使用putIfAbsent將值添加到ConcurrentHashMap中,如果它們不作爲原子操作存在的話。判斷putIfAbsent是否修改了ConcurrentHashMap的正確方法是什麼?
這一切看起來都不錯,但我真的可以確定是否真的添加了新對象。
我最好的想法是檢查putIfAbsent的返回值是否爲null,看起來像它應該工作,只要我們從不將null值放入映射中(但ConcurrentHashMap不允許),但我是想知道是否有我錯過的東西。或者這是做到這一點的正確方法?
使用CHM在這種情況下,最好的辦法是這樣的:
Object o = concurrentMap.get(key);
if(o == null){
Object ret = concurrentMap.putIfAbsent(key, value);
if(ret == null){
o = ret;
}
}
return o;
的get
調用是非阻塞的,所以你要儘可能您可以利用非阻塞調用。如果調用多個函數,連續調用putIfAbsent
會降低性能。
'containsKey()'會更具可讀性。 –
但會打敗目的。你想要的地圖中的值,如果它在那裏,'get()'原子地做。 –
如果您仔細閱讀問題,OP不會要求返回值,只是爲了檢查是否有值。 –
檢查'putIfAbsent()'的返回值是正確的方法。 –
@SeanBright是的,這是我也得出的結論,但「return == null」似乎是一種奇怪的方式來檢查操作已經完成的事實。 –
相關:[在使用putIfAbsent之前是否應該檢查映射是否包含密鑰](http://stackoverflow.com/questions/3752194/should-you-check-if-the-map-containskey-before-using-concurrentmaps-putifabsent ) –