ConcurrentHashMap.put和ConcurrentHashMap.replace有何区别?

9

根据Javadoc文档,我知道ConcurrentHashMap.replace是原子操作,但ConcurrentHashMap.put呢?我看它们在源代码中的实现不同,但我无法弄清它们之间的区别。请问有什么大牛能够指导如何使用这两种方法吗?

3个回答

14

它们在功能上有所不同。replace仅在指定的键已经存储了一个值的情况下才存储键值对。 replace的API文档解释如下:

  

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

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

除了该操作是原子性执行之外,没有其他不同。


2

put()是从AbstractMap类继承而来,而ConcurrentHashMap则扩展了它。对于put()方法没有特定的并发契约。这种继承允许在Map的“传统”上下文中使用ConcurrentHashMap。但是,没有任何AbstractMap方法是原子性的。

replace()是按照ConcurrentMap接口的要求实现的。该接口需要像replace()这样的原子操作。只有该接口的方法才能在并发感知代码中使用。

要进行原子put()操作,请使用同一ConcurrentMap接口中的putIfAbsent()方法。


0

查看ConcurrentHashMap中PUT方法的代码,实现中已经添加了原子行为,并且Java文档中说:

这个类遵守与Hashtable相同的功能规范,并包括与Hashtable每个方法对应的版本的方法。

据我所知,在ConcurrentHashMap中使用put方法是安全的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接