gpt4 book ai didi

java - ConcurrentHashMap 和 putAll() 方法

转载 作者:行者123 更新时间:2023-11-29 08:19:12 37 4
gpt4 key购买 nike

通常(即不是并发),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/

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