在下面的代码中:

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构造函数无法以原子方式获取值的副本-如果其他线程在复制映射时更改了映射,则迭代器将无效。

09-11 21:30