9

从 Javadoc 我知道ConcurrentHashMap.replace是原子的,但是呢ConcurrentHashMap.put?我看到它们在源代码中的实现方式不同,但我无法弄清楚它们的区别。任何大师就如何使用这两种方法提供一些指导?

4

3 回答 3

14

它们在功能上是不同的。replace仅当指定键下已存储值时才存储键值对。的 API 文档对此进行replace了解释:

仅当当前映射到某个值时才替换键的条目。这相当于

if (map.containsKey(key)) {
    return map.put(key, value);
} else return null;

除了动作是原子执行的。

于 2012-08-15T10:15:32.047 回答
2

put()继承自AbstractMap扩展的类ConcurrentHashMap。没有特定的并发合同put()。这种继承允许在ConcurrentHashMapMap 的“传统”上下文中使用。但是没有AbstractMap一种方法是原子的。

replace()ConcurrentMap根据接口的要求实现。此接口需要原子操作,例如replace(). 只有此接口的方法才能在并发感知代码中使用。

要进行原子put()操作,请使用putIfAbsent()来自同一个ConcurrentMap接口。

于 2012-08-15T12:25:18.327 回答
0

查看 ConcurrentHashMap 中的 PUT 代码,实现添加了原子行为,Java 文档说:

Blockquote 该类遵循与 Hashtable 相同的功能规范,并包含与 Hashtable 的每个方法对应的方法版本。

As I understand, it should be safe to use put method in a ConcurrentHashMap.

于 2017-03-26T13:25:24.850 回答