我正在使用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 ) –