从Javadoc我知道ConcurrentHashMap.replace
是原子的,但是ConcurrentHashMap.put
呢?我发现它们在源代码中的实现方式不同,但我无法弄清楚它们之间的区别。任何大师都会提供一些关于如何使用这两种方法的指导原则?
答案 0 :(得分:13)
它们在功能上有所不同。 replace
仅存储键值对(如果已存在指定键下的值)。 replace
的API文档解释了它:
仅当前映射到某个值时才替换键的条目。这相当于
if (map.containsKey(key)) { return map.put(key, value); } else return null;
除了动作以原子方式执行。
答案 1 :(得分:2)
put()
继承自AbstractMap
扩展的类ConcurrentHashMap
。 put()
上没有特定的并发合同。这种继承允许在Map的“传统”上下文中使用ConcurrentHashMap
。但是没有AbstractMap
方法是原子的。
replace()
是根据ConcurrentMap
接口的请求实现的。此接口需要replace()
等原子操作。只有此接口的方法才能用于并发感知代码。
要进行原子put()
操作,请使用来自同一putIfAbsent()
接口的ConcurrentMap
。
答案 2 :(得分:0)
在ConcurrentHashMap中查看PUT的代码,实现中添加了原子行为,Java文档说:
块引用 该类遵循与Hashtable相同的功能规范,并包括与Hashtable的每个方法相对应的方法版本。
据我了解,在ConcurrentHashMap中使用put方法应该是安全的。