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 6ConcurrentHashMap
实现了putAll()
作为put()
操作的循环,因此它并不比自己做的更好或更差。Java集合中的第一个(大部分)线程安全映射是使用同步的。它一次只允许一次操作。Java5添加了,但工作方式不同。基本上,整个过程分为几部分。操作只会锁定相关的片。它还添加了线程安全原语,如
我解释这一点的原因是,效率的高低取决于它的实现方式。它可以通过锁定整个映射来工作,这实际上可能比在每个put()
上获取单个锁更有效。或者它可以通过执行一系列put()
调用来工作,在这种情况下没有太大区别
因此,如果它对您的代码有意义,并且您正在同时进行大量更新,我将使用putAll()
,除非您要的是putIfAbsent()
Edit:我刚刚检查过,Java 6ConcurrentHashMap
实现了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:那么不创建地图是有道理的。