Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentHashMap和putAll()方法_Java_Hashmap_Concurrency_Concurrenthashmap - Fatal编程技术网

Java ConcurrentHashMap和putAll()方法

Java ConcurrentHashMap和putAll()方法,java,hashmap,concurrency,concurrenthashmap,Java,Hashmap,Concurrency,Concurrenthashmap,通常(即不同时),putAll()不能比使用大量调用put()更有效,即使假设您排除了构建传递给putAll()的其他映射的成本。这是因为putAll()将需要迭代传递的映射的元素,并运行将每个键值对添加到put()执行的映射的算法 但是对于ConcurrentHashMap,构建一个常规映射,然后使用putAll()更新它有意义吗?或者我应该只调用10次(或100次或1000次)调用put() 对putIfAbsent()的多次调用的答案是否会更改 谢谢 Java集合中的第一个(大部分)线程安

通常(即不同时),
putAll()
不能比使用大量调用
put()
更有效,即使假设您排除了构建传递给
putAll()
的其他映射的成本。这是因为
putAll()
将需要迭代传递的映射的元素,并运行将每个键值对添加到
put()
执行的映射的算法

但是对于ConcurrentHashMap,构建一个常规映射,然后使用
putAll()
更新它有意义吗?或者我应该只调用10次(或100次或1000次)调用
put()

putIfAbsent()
的多次调用的答案是否会更改

谢谢

Java集合中的第一个(大部分)线程安全映射是使用同步的。它一次只允许一次操作。Java5添加了,但工作方式不同。基本上,整个过程分为几部分。操作只会锁定相关的片。它还添加了线程安全原语,如

我解释这一点的原因是,效率的高低取决于它的实现方式。它可以通过锁定整个映射来工作,这实际上可能比在每个
put()
上获取单个锁更有效。或者它可以通过执行一系列
put()
调用来工作,在这种情况下没有太大区别

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

Edit:我刚刚检查过,Java 6
ConcurrentHashMap
实现了
putAll()
作为
put()
操作的循环,因此它并不比自己做的更好或更差。

Java集合中的第一个(大部分)线程安全映射是使用同步的。它一次只允许一次操作。Java5添加了,但工作方式不同。基本上,整个过程分为几部分。操作只会锁定相关的片。它还添加了线程安全原语,如

我解释这一点的原因是,效率的高低取决于它的实现方式。它可以通过锁定整个映射来工作,这实际上可能比在每个
put()
上获取单个锁更有效。或者它可以通过执行一系列
put()
调用来工作,在这种情况下没有太大区别

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

Edit:我刚刚检查过,Java 6
ConcurrentHashMap
实现了
putAll()
作为
put()
操作的循环,因此它并不比自己做的更好或更糟。

putAll()
只是委托给
put()
。如果你还没有中间地图,就没有必要建立它。您可以在源代码中看到这一点,使用什么Java实现并不重要,因为代码是公共域,并且由所有人共享

请注意,
putAll()
不是原子的,只是保证每个
put()
都是原子的。

putAll()
只是委托给
put()
。如果你还没有中间地图,就没有必要建立它。您可以在源代码中看到这一点,使用什么Java实现并不重要,因为代码是公共域,并且由所有人共享


请注意,
putAll()
不是原子的,只是保证每个
put()
都是原子的。

您甚至使用线程来填充ConcurrentHashMap吗?如果不是,则putAll()或100个连续put()之间没有任何区别,(至少)一个线程正在向ConcurrentHashMap写入,多个线程正在从中读取。putAll()类似于在CHM中添加多个元素的自动过程,而不是自己一个接一个地做。你甚至用线程来填充ConcurrentHashMap吗?如果不是,则putAll()或100个连续put()之间没有任何区别,(至少)一个线程正在向ConcurrentHashMap写入,多个线程正在从中读取。putAll()类似于在CHM中添加多个元素的自动过程,而不是自己一个接一个地做。我想它可能会为所有的更新获得一个锁,但我想不会。我将单独调用ConcurrentHashMap的
put()
,以避免构建另一个映射的成本。检查源代码很好,但是我满足于“没有更好或更差”,因为越清晰的代码就是越清晰的代码^^^^代码越清晰越好,但使用
putAll()
我必须创建一个新映射(这会产生对
put()
的多个调用)。@Rudiger:那么不创建映射是有意义的。我想它可能会为所有更新获得一个锁,但我想不会。我只会单独调用ConcurrentHashMap的
put()
并避免构建另一个映射的成本。检查源代码很好,但是我认为“没有更好或更差”,因为越清晰的代码就是越清晰的代码^^^拥有更清晰的代码很好,但是使用
putAll()
我必须创建一个新映射(这会产生对
put()
的多个调用)@Rudiger:那么不创建地图是有道理的。