gpt4 book ai didi

java - Java中ConcurrentHashMap的查询

转载 作者:行者123 更新时间:2023-12-02 06:45:57 24 4
gpt4 key购买 nike

我有一个关于 ConcurrentHashMap 的查询。

ConcurrentHashMap是并发访问的映射。 ConcurrentHashMap 实现了 ConcurrentMap,它扩展了 Map

a) ConcurrentHashMap 实现了 ConcurrentMap 中定义的原子方法(如 putifAbsent 等)。

b) 但是,ConcurrentMap 扩展的 Map 接口(interface)中的方法怎么样? 它们现在如何成为原子的?它们是否已被 ConcurrentHashMap

重新实现

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

最佳答案

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

如果您向接受 Map 的方法提供 ConcurrentHashMap,那么它将起作用,并且您将获得您期望的并发行为。 Map 只是一个描述一组方法的接口(interface),ConcurrentHashMap 实现了具有并发行为的接口(interface)。

“并发”和“原子”之间是有区别的。并发意味着多个操作可以同时发生,并且映射(或我们正在讨论的任何数据结构)将始终处于有效状态。这意味着您可以有多个线程在此映射上调用 put()、get()、remove() 等,并且永远不会出现任何错误(如果您使用常规 HashMap 尝试此操作,您将收到错误,因为它不是)旨在处理并发)。

原子意味着一个采取多个步骤的操作对于其他线程来说似乎只采取了一个步骤 - 就像他们知道它已经完全完成或什至还没有开始一样。对于 ConcurrentHashMap,putIfAbsent() 就是这样的一个例子。来自 javadoc,

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

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

除了该操作是原子执行的。

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

关于java - Java中ConcurrentHashMap的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18632747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com