【发布时间】:2011-12-14 23:35:02
【问题描述】:
方法 ConcurrentHashMap.putAll(Map) 应该是原子的吗?
我在文档中找不到它,ConcurrentMap 接口中也没有提到它,所以我猜答案是否定的。我要求它确定,因为说实话,如果该操作不是原子的,那就没有意义了。
如果它不是原子的,那么支持多个项目的原子插入的最佳方式是什么?回到过去的好同步?
【问题讨论】:
标签: java atomic concurrenthashmap
方法 ConcurrentHashMap.putAll(Map) 应该是原子的吗?
我在文档中找不到它,ConcurrentMap 接口中也没有提到它,所以我猜答案是否定的。我要求它确定,因为说实话,如果该操作不是原子的,那就没有意义了。
如果它不是原子的,那么支持多个项目的原子插入的最佳方式是什么?回到过去的好同步?
【问题讨论】:
标签: java atomic concurrenthashmap
它不是原子的,不。根据the class documentation:
对于
putAll和clear等聚合操作,并发检索可能仅反映插入或删除某些条目。
要原子化它,你必须使用synchronized,是的。没有非阻塞方式可以做到这一点。
【讨论】:
putAll 成为原子的,您必须完全摆脱它(因为您不能原子地报告多个段已更新)。也就是说,这取决于您的业务分布。如果您期望正常的puts 相对较少,但期望有很多gets 和putAlls,那么创建一个使用ReadWriteLock 来控制的HashMap 的子类可能是有意义的访问:所有读取都将被包裹在一个读锁中,所有写入,包括整个putAll,都将被包裹在一个写锁中。
在the doc的顶部
对于
putAll和clear等聚合操作,并发 检索可能仅反映某些条目的插入或删除。
【讨论】:
putAll() 不是原子的,只是保证每个 put() 都是原子的。
【讨论】:
要原子化它,你必须使用同步,是的
不仅如此:您必须在每个公共 map 方法周围放置一个同步块,从而降低并发性。
【讨论】: