ConcurrentHashMap.put V.S. ConcurrentHashMap.replace

时间:2012-08-15 10:09:52

标签: java concurrency map java.util.concurrent concurrenthashmap

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

3 个答案:

答案 0 :(得分:13)

它们在功能上有所不同。 replace仅存储键值对(如果已存在指定键下的值)。 replace的API文档解释了它:

  

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

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

除了动作以原子方式执行。

答案 1 :(得分:2)

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

replace()是根据ConcurrentMap接口的请求实现的。此接口需要replace()等原子操作。只有此接口的方法才能用于并发感知代码。

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

答案 2 :(得分:0)

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

  

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

据我了解,在ConcurrentHashMap中使用put方法应该是安全的。