根据Javadoc文档,我知道ConcurrentHashMap.replace
是原子操作,但ConcurrentHashMap.put
呢?我看它们在源代码中的实现不同,但我无法弄清它们之间的区别。请问有什么大牛能够指导如何使用这两种方法吗?
根据Javadoc文档,我知道ConcurrentHashMap.replace
是原子操作,但ConcurrentHashMap.put
呢?我看它们在源代码中的实现不同,但我无法弄清它们之间的区别。请问有什么大牛能够指导如何使用这两种方法吗?
它们在功能上有所不同。replace
仅在指定的键已经存储了一个值的情况下才存储键值对。 replace
的API文档解释如下:
仅当当前映射到某个值时才替换键的条目。这相当于
if (map.containsKey(key)) { return map.put(key, value); } else return null;
除了该操作是原子性执行之外,没有其他不同。
put()
是从AbstractMap
类继承而来,而ConcurrentHashMap
则扩展了它。对于put()
方法没有特定的并发契约。这种继承允许在Map的“传统”上下文中使用ConcurrentHashMap
。但是,没有任何AbstractMap
方法是原子性的。
replace()
是按照ConcurrentMap
接口的要求实现的。该接口需要像replace()
这样的原子操作。只有该接口的方法才能在并发感知代码中使用。
要进行原子put()
操作,请使用同一ConcurrentMap
接口中的putIfAbsent()
方法。
查看ConcurrentHashMap中PUT方法的代码,实现中已经添加了原子行为,并且Java文档中说:
这个类遵守与Hashtable相同的功能规范,并包括与Hashtable每个方法对应的版本的方法。
据我所知,在ConcurrentHashMap中使用put方法是安全的。