java - 调用values()时需要同步并发HashMap吗?

标签 java concurrency hashmap

在下面的代码中:

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/

相关文章:

java - 如何在SWT中构建TableViewer的弹出窗口?

java - 使用 reactor 的 Flux.buffer 进行批处理仅适用于单个项目

c - ncurses、print 和 contemporary 获取字符串

java - 可重入锁 - Java 并发实践

java - 使用 jackson 创建一个 json 对象

java - 什么是 java.lang.Class<?>[]

java - 配置Elasticsearch到java SpringBoot应用程序

go - 对使用 CSP 实现的并发程序进行建模

java - Java 8 Streams 中的过滤映射

java - 字符串缓冲区 : Adding a newline after a certain amount of words for formatting