ConcurrentMap.putIfAbsent() 中提到的前一个值是多少

What is the previous value mentioned in ConcurrentMap.putIfAbsent()

ConcurrentMap指定putIfAbsent()的return值为:

the previous value associated with the specified key, or null if there was no mapping for the key. (A null return can also indicate that the map previously associated null with the key, if the implementation supports null values.)

并给出以下代码作为示例。

if (!map.containsKey(key))
    return map.put(key, value);
else
    return map.get(key);
}

问题是,如果 map.put(key, value) 仅在映射中不存在具有给定键的条目时才调用,那么怎么会有先前的值?在我看来,如果在调用 putIfAbsent().

之前不存在具有给定键的条目,则它总是 return 当前值或 null

考虑以下几行:

ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
System.out.println(map.putIfAbsent("key", "value1")); // prints null (no previous value)
System.out.println(map.putIfAbsent("key", "value2")); // prints "value1"

第一次调用 putIfAbsent 时,没有与键 key 关联的值。因此,putIfAbsent 将 return null 如文档所述。

在第二次调用时,putIfAbsent 将 return 之前的映射,即 value1 并且该值不会在映射中更新,因为它已经存在。

虽然 putIfAbsent 确实总是 return 当前值(如果存在该键的映射),但此处引入 "previous value" 的概念是为了与Map.put 的定义,其中 return 是前一个值。引用其 Javadoc:

the previous value associated with key, or null if there was no mapping for key.

如果我们谈论任何并发数据结构,我们需要记住这些数据结构是为并发执行而设计的。

putIfAbsent 意味着如果 Thread1Thread2 将尝试添加一些具有相同 key 的数据,那么只有一个 Thread 会这样做。

我认为这里的previous这个词只是为了强调这个值在调用之前已经在map中了。这不是一个很好的用词选择,因为它暗示地图中可能有一个不同于以前的新值,而实际上不可能。但是代码示例完美地解释了该方法的作用,所以我不会担心它。