我有一个ConcurrentMap 对象。我想编写一个方法,如果存在,将返回SomeObject值,或者创建一个新的SomeObject,将其放入Map中,如果不存在,则返回它。

理想情况下,我可以使用ConcurrentMap的putIfAbsent(key, new SomeObject(key)),但这意味着我每次都创建一个新的SomeObject(key),这似乎非常浪费。

因此,我求助于以下代码,但不确定这是否是处理此问题的最佳方法:

public SomeValue getSomevalue(String key){

  SomeValue result = concurrentMap.get(key);

  if (result != null)
    return result;

  synchronized(concurrentMap){

    SomeValue result = concurrentMap.get(key);

    if (result == null){
      result = new SomeValue(key);
      concurrentMap.put(key, result);
    }

    return result;
  }
}

最佳答案



然后使用 computeIfAbsent :

concurrentMap.computeIfAbsent(key, SomeObject::new);

synchronized与ConcurrentMap一起使用不会阻止其他线程在synchronized块中间的 map 上执行操作。 ConcurrentMap不 promise 使用 map 的监视器进行同步,并且ConcurrentHashMap和ConcurrentSkipListMap都不在 map 对象上同步。

请注意,ConcurrentMap接口(interface)不保证该值将只被计算一次,或者如果键已经存在,则不会计算该值。 ConcurrentHashMap做出了这些 promise ,但ConcurrentSkipListMap却没有。

10-05 21:13