2017-01-25 32 views
1

我正在使用putIfAbsent将值添加到ConcurrentHashMap中,如果它们不作为原子操作存在的话。判断putIfAbsent是否修改了ConcurrentHashMap的正确方法是什么?

这一切看起来都不错,但我真的可以确定是否真的添加了新对象。

我最好的想法是检查putIfAbsent的返回值是否为null,看起来像它应该工作,只要我们从不将null值放入映射中(但ConcurrentHashMap不允许),但我是想知道是否有我错过的东西。或者这是做到这一点的正确方法?

+4

检查'putIfAbsent()'的返回值是正确的方法。 –

+0

@SeanBright是的,这是我也得出的结论,但“return == null”似乎是一种奇怪的方式来检查操作已经完成的事实。 –

+0

相关:[在使用putIfAbsent之前是否应该检查映射是否包含密钥](http://stackoverflow.com/questions/3752194/should-you-check-if-the-map-containskey-before-using-concurrentmaps-putifabsent ) –

回答

3

使用CHM在这种情况下,最好的办法是这样的:

Object o = concurrentMap.get(key); 

if(o == null){ 
    Object ret = concurrentMap.putIfAbsent(key, value); 
    if(ret == null){ 
     o = ret; 
    } 
} 
return o; 

get调用是非阻塞的,所以你要尽可能您可以利用非阻塞调用。如果调用多个函数,连续调用putIfAbsent会降低性能。

+1

'containsKey()'会更具可读性。 –

+0

但会打败目的。你想要的地图中的值,如果它在那里,'get()'原子地做。 –

+0

如果您仔细阅读问题,OP不会要求返回值,只是为了检查是否有值。 –

相关问题