在下面的代码中:
private final Map<A, B> entriesMap = Collections
.synchronizedMap(new HashMap<A, B>());
// ...
List<B> entries = new ArrayList<>(this.entriesMap.values());
如果entriesMap
在其他方法中被多个线程访问/修改,是否需要对entriesMap
进行同步
?换句话说:
List<B> entries;
synchronize (this.entriesMap) {
entries = new ArrayList<>(this.entriesMap.values());
}
如果我是正确的,values()
不是一个原子操作,与 put()
和 get()
不同,对吗?
谢谢!
最佳答案
问题是,即使 values()
本身是原子的,但对其进行迭代的行为却不是原子的。 ArrayList 构造函数无法以原子方式获取值的副本 - 如果另一个线程在复制它们时更改映射,则迭代器将失效。
关于java - 调用values()时需要同步并发HashMap吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535543/