9

方法 ConcurrentHashMap.putAll(Map) 应该是原子的吗?

我在文档中找不到它,并且 ConcurrentMap 界面中没有提到它,所以我猜答案是否定的。我要求它确定,因为说实话,如果该操作不是原子的,那就没有意义了。

如果它不是原子的,那么支持多个项目的原子插入的最佳方法是什么?回到好旧的同步?

4

4 回答 4

10

它不是原子的,不。根据类文档

putAll对于和等聚合操作clear,并发检索可能仅反映插入或删除某些条目。

要原子化它,你必须使用synchronized,是的。没有非阻塞方式可以做到这一点。

于 2011-12-14T23:40:31.807 回答
3

在文档的顶部

putAll对于和等聚合操作clear,并发检索可能仅反映插入或删除某些条目。

于 2011-12-14T23:41:21.273 回答
2

putAll()不是原子的,而只是保证每个个体put()都是原子的。

于 2011-12-14T23:42:34.313 回答
2

要原子化它,你必须使用同步,是的

不仅如此:您必须在每个公共 map 方法周围放置一个同步块,从而降低并发性。

于 2012-10-16T06:57:28.033 回答