java - ConcurrentHashMap 和 putAll() 方法

标签 java hashmap concurrency concurrenthashmap

通常(即不是并发),putAll() 不会比多次调用 put() 更有效,即使假设您排除了构建您传递给 putAll() 的另一个 Map。这是因为 putAll() 将需要迭代传递的 Map 元素,并运行用于将每个键值对添加到 put() 执行的 Map 的算法。

但是对于一个 ConcurrentHashMap 来说,构造一个常规的 Map 然后使用 putAll() 更新它有意义吗?或者我应该对 put() 进行 10 次(或 100 次或 1000 次)调用?

多次调用 putIfAbsent() 的答案是否改变?

谢谢!

最佳答案

Java Collections 中的第一个(主要是)线程安全 Map 是同步的 HashMap 使用 Collections.synchronizedMap() .它的工作原理是一次只允许一个操作。 Java 5 添加了 ConcurrentHashMap , 它的工作方式不同。基本上是 Map 被分成片。 put() 操作只会锁定相关的切片。它还添加了线程安全原语,如 putIfAbsent() .

我解释这个的原因是 putAll() 可能或多或少取决于它的实现方式。它可能通过锁定整个 map 来工作,这实际上可能比尝试在每个 put() 上获得单独的锁更有效。 .或者它可以通过做一堆 put() 来工作无论如何调用,在这种情况下没有太大区别。

因此,如果它对您的代码有意义并且您同时进行大量更新,我会使用 putAll()除非它是 putIfAbsent()就是你想要的。

编辑: 我刚刚检查过,Java 6 ConcurrentHashMap工具 putAll()作为 put() 的循环操作,所以这并不比自己做更好或更糟。

关于java - ConcurrentHashMap 和 putAll() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677916/

相关文章:

java - 如果从多个线程使用 HashMap#put/remove 是否会遇到 ConcurrentModificationException

java - 在 Android 中从 HTTP 检索 XML/流的最佳实践

java - Android - 基于 pubnub 聊天的自定义 ListView

java - 输入后我的按钮无法激活,我不明白为什么

java - 具有重复值的映射

python - 了解并发进程

Java 正则表达式不匹配(俄语)

Java servlet 方法 HashMap 范围

java - 防止多次添加 HashMap 键条目?

java - 继承的非最终字段对其他线程可见吗?