Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guava Multimap.values()集合是否会引发并发修改异常?_Java_Multithreading_Guava - Fatal编程技术网

Java Guava Multimap.values()集合是否会引发并发修改异常?

Java Guava Multimap.values()集合是否会引发并发修改异常?,java,multithreading,guava,Java,Multithreading,Guava,如果返回集合在另一个线程上迭代,而主多重映射在另一个线程上更改,则Guava Multimap.values()集合是否会引发并发修改异常 如果是这样,如何避免这种情况 基本上,我需要从另一个线程上运行的方法返回Multimap.values()集合,而主线程可能会更新Multimap 这份文件上的声明是否意味着我会没事? “*当任何并发操作更新 *多重映射。并发读取操作将正常工作。若要允许并发 *更新操作,通过调用{@link来包装多重映射 *多重映射#synchronizedListMult

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

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

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

这份文件上的声明是否意味着我会没事? “*当任何并发操作更新 *多重映射。并发读取操作将正常工作。若要允许并发 *更新操作,通过调用{@link来包装多重映射 *多重映射#synchronizedListMultimap}。“


谢谢

简短回答:是的,它确实抛出ConcurrentModificationException;我可以通过以下方式获得一个:

 Multimaps.synchronizedListMultimap(ArrayListMultimap.<Integer, Integer>create());
Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
Multimap.values()返回的迭代器是HashMap和ArrayList的代理(复合迭代器)


作为一个快速的骇客丑陋的修复,你可以在多重地图上shyncronize。这是因为Multimaps.synchronizedListMultimap返回一个synchronizedListMultimap。SynchronizedListMultimap扩展SynchronizedObject,此对象是使用空互斥体构建的,因此它将使用自身进行同步

是的,会的。有关更多详细信息,请参见[此答案][1]。[1] :当然,如果您在迭代时从同一线程更改多重映射,即使您已同步,它仍将引发异常。