我对ConcurrentHashMap
。
ConcurrentHashMap
是并发访问的映射。 ConcurrentHashMap
实现了扩展ConcurrentMap
的{{1}}。
a)Map
实现ConcurrentHashMap
中定义的方法(如ConcurrentMap
等),这些方法是原子的。
b)但是,putifAbsen
扩展的Map接口中的方法怎么样?
它们现在如何原子化?它们是由ConcurrentMap
如果我有ConcurrentHashMap
类型的引用并从中调用方法
ConcurrentHashMap
接口(例如put)或任何其他方法,该方法是原子方法吗?
答案 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