繁体   English   中英

ConcurrentHashMap.put VS ConcurrentHashMap.replace

[英]ConcurrentHashMap.put V.S. ConcurrentHashMap.replace

从Javadoc我知道ConcurrentHashMap.replace是原子的,但是ConcurrentHashMap.put怎么样? 我看到它们在源代码中的实现方式不同,但我无法弄清楚它们的区别。 任何大师都会给出一些关于如何使用这两种方法的指导方针?

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

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

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

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

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

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

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

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

Blockquote此类遵循与Hashtable相同的功能规范,并包含与Hashtable的每个方法对应的方法版本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM