哪个用于迭代列表或映射的代码序列可以防止ConcurrentModificationException?我们的代码中反复出现零星的ConcurrentModificationException。有两个原因导致此问题。


另一个线程在迭代时更改列表
循环中调用的方法正在更改列表。


问题1可以通过环回同步来解决。但是,如果像原因2那样在循环中调用外来代码,这将是很糟糕的。

问题2可以通过列表或地图的副本来解决。

这意味着列表或映射必须在循环之前在同步块中复制。有更好的解决方案吗?

一些示例代码:

public void todoSomeThings( Map<Abc, Object> map ){
    for( Abc abc : map.keySet() ){
        abc.todoSomeThings();
    }
}

最佳答案

一个合理的警告:使用j.u.c(java.util.concurrent)将消除错误,但您将遇到可能更糟的情况,即种族更新,陈旧的读取等。最佳实践是

了解您的数据结构,使用状态...或至少(不是最好)使用锁。

10-07 19:43
查看更多