通常(即不同时), putAll()
不能比使用大量的调用 put()
,即使您排除了构建传递给的另一个Map的成本 putAll()
. 那是因为 putAll()
将需要迭代传递的Map的元素,以及运行将每个键值对添加到Map的算法 put()
执行。
但是对于concurrenthashmap,构造一个正则Map然后使用 putAll()
要更新吗?或者我应该打10个(或者100个,或者1000个)电话给 put()
?
多个呼叫的应答是否会改变 putIfAbsent()
?
谢谢!
2条答案
按热度按时间lndjwyie1#
java集合中的第一个(大部分)线程安全Map是synchronized
HashMap
使用Collections.synchronizedMap()
. 它一次只允许一个操作。Java5增加了ConcurrentHashMap
,工作原理不同。基本上Map
被分成几片。一put()
操作将只锁定相关切片。它还添加了线程安全原语,如putIfAbsent()
.我解释的原因是
putAll()
效率的高低取决于它的实现方式。它可以通过锁定整个Map来工作,这实际上可能比在每个Map上获取单个锁更有效put()
. 或者它可以通过做一些put()
不管怎么说,在这种情况下没有太大的区别。因此,如果它对您的代码有意义,并且您同时进行了大量更新,我将使用
putAll()
除非是putIfAbsent()
你想要的。编辑:我刚查过,Java6
ConcurrentHashMap
工具putAll()
作为一个循环put()
所以这并不比你自己做更好或者更糟。vfhzx4xs2#
putAll()
只是代表put()
. 没有必要建立一个中间Map,如果你还没有它。您可以在源代码中看到这一点,而且无论您使用的是什么java实现,因为代码是公共域的,并且由所有人共享。请注意
putAll()
不是原子的,只是保证每个个体put()
是原子的。