concurrenthashmap和putall()方法

4ioopgfo  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(357)

通常(即不同时), putAll() 不能比使用大量的调用 put() ,即使您排除了构建传递给的另一个Map的成本 putAll() . 那是因为 putAll() 将需要迭代传递的Map的元素,以及运行将每个键值对添加到Map的算法 put() 执行。
但是对于concurrenthashmap,构造一个正则Map然后使用 putAll() 要更新吗?或者我应该打10个(或者100个,或者1000个)电话给 put() ?
多个呼叫的应答是否会改变 putIfAbsent() ?
谢谢!

lndjwyie

lndjwyie1#

java集合中的第一个(大部分)线程安全Map是synchronized HashMap 使用 Collections.synchronizedMap() . 它一次只允许一个操作。Java5增加了 ConcurrentHashMap ,工作原理不同。基本上 Map 被分成几片。一 put() 操作将只锁定相关切片。它还添加了线程安全原语,如 putIfAbsent() .
我解释的原因是 putAll() 效率的高低取决于它的实现方式。它可以通过锁定整个Map来工作,这实际上可能比在每个Map上获取单个锁更有效 put() . 或者它可以通过做一些 put() 不管怎么说,在这种情况下没有太大的区别。
因此,如果它对您的代码有意义,并且您同时进行了大量更新,我将使用 putAll() 除非是 putIfAbsent() 你想要的。
编辑:我刚查过,Java6 ConcurrentHashMap 工具 putAll() 作为一个循环 put() 所以这并不比你自己做更好或者更糟。

vfhzx4xs

vfhzx4xs2#

putAll() 只是代表 put() . 没有必要建立一个中间Map,如果你还没有它。您可以在源代码中看到这一点,而且无论您使用的是什么java实现,因为代码是公共域的,并且由所有人共享。
请注意 putAll() 不是原子的,只是保证每个个体 put() 是原子的。

相关问题