【问题标题】:Will the Guava Multimap .values() collection throw concurrent modification exceptions?Guava Multimap .values() 集合会抛出并发修改异常吗?
【发布时间】:2014-07-12 16:27:04
【问题描述】:

如果返回集合在另一个线程上迭代而主多映射在另一个线程上发生更改,Guava Multimap .values() 集合是否会引发并发修改异常?

如果是这样,如何避免这种情况?

基本上我需要从另一个线程上运行的方法返回 Multimap .values() 集合,而主线程可能会更新 Multimap。

文档中的这个声明是否意味着我会没事的? " *

当任何并发操作更新 *多图。并发读取操作将正常工作。允许并发 * 更新操作,通过调用 {@link 来包装你的多图 * Multimaps#synchronizedListMultimap}。”

谢谢

【问题讨论】:

标签: java multithreading guava


【解决方案1】:

简短回答:是的,它确实会抛出 ConcurrentModificationException;我能够得到一个使用:

 Multimaps.synchronizedListMultimap(ArrayListMultimap.<Integer, Integer>create());

Multimap.values() 返回的迭代器是 HashMap 和 ArrayList 的代理(复合迭代器)

作为一个快速的 hacky 丑陋修复,您可以在该多图上进行 shyncronize。这是因为 Multimaps.synchronizedListMultimap 返回一个 SynchronizedListMultimap。 SynchronizedListMultimap 扩展了 SynchronizedObject 并且这个是使用空互斥体构建的,因此它将使用自己进行同步。

【讨论】:

  • 当然,如果您在迭代时从同一个线程更改该多映射,即使您已同步,它仍然会抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2022-07-09
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多