在Java中查询ConcurrentHashMap

时间:2013-09-05 09:35:01

标签: java map concurrency

我对ConcurrentHashMap

有疑问

ConcurrentHashMap是并发访问的映射。 ConcurrentHashMap实现了扩展ConcurrentMap的{​​{1}}。

a)Map实现ConcurrentHashMap中定义的方法(如ConcurrentMap等),这些方法是原子的。

b)但是,putifAbsen扩展的Map接口中的方法怎么样?    它们现在如何原子化?它们是由ConcurrentMap

重新实现的

如果我有ConcurrentHashMap类型的引用并从中调用方法    ConcurrentHashMap接口(例如put)或任何其他方法,该方法是原子方法吗?

3 个答案:

答案 0 :(得分:1)

Map只是一个界面。因此ConcurrentHashMap具有这些方法的原子实现。

putIfAbsent方法在并发环境中是一种方便的方法,可以执行if not contains then put接口无法执行的原子Map,即使Map实际上是ConcurrentHashMap输入{{1}}。

答案 1 :(得分:1)

ConcurrentHashMap不扩展HashMap。它们都是hash table的实现,但ConcurrentHashMap与HashMap的内部结构非常不同,以便提供并发性。

如果您为接受Map的方法提供ConcurrentHashMap,那么它将起作用,您将获得您期望的并发行为。 Map只是一个描述一组方法的接口,ConcurrentHashMap使用并发行为实现该接口。

'concurrent'和'atomic'之间存在差异。并发意味着多个操作可以同时发生,并且Map(或我们正在讨论的任何数据结构)将始终处于有效状态。这意味着您可以在此地图上有多个线程调用put(),get(),remove()等,并且永远不会有任何错误(如果您使用常规HashMap尝试此操作,您将收到错误,因为它不是旨在处理并发)。

Atomic意味着采取多个步骤的操作似乎只向其他线程迈出了一步 - 尽管他们知道它已完全完成或尚未启动。对于ConcurrentHashMap,putIfAbsent()就是这样一个例子。来自javadoc,

如果指定的键尚未与值关联,请将其与给定值相关联。这相当于:

if (!map.containsKey(key)) {
   return map.put(key, value);
else
   return map.get(key);

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

如果您使用ConcurrentHashMap尝试了上述代码,则不会出现任何错误(因为它是并发的),但是其他线程与主线程交错并且您的条目将被覆盖或删除。 ConcurrentMap指定原子putIfAbsent()方法,以确保实现可以原子方式执行这些步骤,而不会受到其他线程的干扰。

答案 2 :(得分:0)

像put()和remove()这样的方法的实现正在锁定最终的Sync对象,并发检索将始终在地图上提供最新的数据。

对于在整个Map上运行的putAll()或clear(),并发读取可能反映只插入和删除一些条目。

以下两个链接将帮助您了解: http://javarevisited.blogspot.in/2013/02/concurrenthashmap-in-java-example-tutorial-working.html

http://www.javamex.com/tutorials/synchronization_concurrency_8_hashmap2.shtml