在下面的代码中:
private final Map<A, B> entriesMap = Collections
.synchronizedMap(new HashMap<A, B>());
// ...
List<B> entries = new ArrayList<>(this.entriesMap.values());
如果通过其他方法通过多个线程访问/修改了
entriesMap
,是否有必要在synchronize
上使用entriesMap
?换一种说法:List<B> entries;
synchronize (this.entriesMap) {
entries = new ArrayList<>(this.entriesMap.values());
}
如果我是对的,那么
values()
不是原子操作,与put()
和get()
不同,对吗?谢谢!
最佳答案
问题在于,即使values()
本身是原子的,对其进行迭代的行为也不是。 ArrayList
构造函数无法以原子方式获取值的副本-如果其他线程在复制映射时更改了映射,则迭代器将无效。