【问题标题】:What is the correct way to tell whether putIfAbsent modified a ConcurrentHashMap?判断 putIfAbsent 是否修改了 ConcurrentHashMap 的正确方法是什么?
【发布时间】:2017-01-25 16:36:52
【问题描述】:

我正在使用 putIfAbsent 将值添加到 ConcurrentHashMap 如果它们尚未作为原子操作存在。

这一切看起来都很好,但我真的可以判断是否真的添加了一个新对象。

我最好的想法是检查 putIfAbsent 的返回值是否为空,只要我们从不将空值放入映射中(ConcurrentHashMap 无论如何都不允许),这看起来应该可以工作,但我想知道如果有什么我错过了。或者这是正确的做法?

【问题讨论】:

标签: java concurrenthashmap


【解决方案1】:

在这种情况下使用 CHM 的最佳方式如下:

Object o = concurrentMap.get(key);

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

get 调用是非阻塞的,因此您希望尽可能多地利用非阻塞调用。如果多次调用,连续调用putIfAbsent 会降低性能。

【讨论】:

  • 但是会破坏目的。如果映射中存在值,您需要它,get() 会自动执行此操作。
  • 如果你仔细阅读问题,OP不会要求返回值,只是检查是否有值。
  • 我不确定这是否相关。在此答案提供的代码示例中,get() 是必需的。如果您认为使用containsKey() 对原始问题更合适的答案,请创建一个。
  • 可读性相关的。只是指出此代码示例并未直接回答 OP 给出的问题陈述。但是,添加一个基本上只是复制双重检查结构的新答案对我来说没有什么价值,这是这个答案的真正亮点。
猜你喜欢
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多