如果返回集合在另一个线程上更改主多重映射的同时在另一个线程上迭代,那么Guava Multimap .values()集合会抛出并发修改异常吗?
如果是这样,怎么能避免这种情况?
基本上我需要从另一个线程上运行的方法返回Multimap .values()集合,而主线程可能会更新Multimap。
来自文档的这句话是否意味着我会好吗? " *
当任何并发操作更新时,此类不是线程安全的 * multimap。并发读取操作将正常工作。允许并发 *更新操作,通过调用{@link包装您的多图 * Multimaps#synchronizedListMultimap}。"
由于
答案 0 :(得分:0)
简短回答:是的,它确实抛出了ConcurrentModificationException;我能够使用:
Multimaps.synchronizedListMultimap(ArrayListMultimap.<Integer, Integer>create());
Multimap.values()返回的迭代器是HashMap和ArrayList的代理(复合迭代器)
作为一个快速的hacky丑陋的修复,你可以只是在该多图上shyncronize。这是因为Multimaps.synchronizedListMultimap返回SynchronizedListMultimap。 SynchronizedListMultimap扩展了SynchronizedObject,这个是使用null互斥体构建的,因此它将自己用于同步。