从 Javadoc 我知道ConcurrentHashMap.replace
是原子的,但是呢ConcurrentHashMap.put
?我看到它们在源代码中的实现方式不同,但我无法弄清楚它们的区别。任何大师就如何使用这两种方法提供一些指导?
问问题
9092 次
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()
。这种继承允许在ConcurrentHashMap
Map 的“传统”上下文中使用。但是没有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 回答