ConcurrentMap不一致

时间:2014-10-21 14:28:46

标签: java

ConcurrentMap的JavaDoc - putIfAbsent说:

  /**
    * If the specified key is not already associated
    * with a value, associate it with the given value.
    * This is equivalent to
    *
    * if (!map.containsKey(key))
    *     return map.put(key, value);
    * else
    *    return map.get(key);
    *  
    * except that the action is performed atomically.
    */  

但putIfAbsent(来自ConcurrentMap)和put(来自Map)返回前一个值(或者没有前一个值时返回null)。因此,在示例中,当映射不包含键时,返回null。这是代码的正确意图吗?返回“价值”不是更好吗?

2 个答案:

答案 0 :(得分:1)

很可能API是以这种方式设计的,因此您可以区分以前没有映射(并且更新成功)的情况以及先前的映射存在但映射到完全相同的value。< / p>

询问这是否比获取新值更实际没有帮助。我偶尔偶然发现了这种行为。但是,自从Java 5以来,API以这种方式指定,并且不会被更改。

作为旁注,如果不存在先前的映射,则Java 8的Map.computeIfAbsent将表现得更像您期望的返回计算值。

答案 1 :(得分:0)

您已经(或应该)拥有新值。没有理由退回刚插入的内容。

    ConcurrentMap<Integer, String> map = new ConcurrentHashMap<>();
    ...
    String newVal = "someString";
    String old = map.putIfAbsent(1, newVal);
    if(old == null){
        //no previous mapping
    }