Hor*_*ux7 1 java thread-safety concurrentmodification
迭代列表或映射的代码序列会阻止ConcurrentModificationException?我们的代码中有反复和零星的ConcurrentModificationException.这个问题有两个原因.
问题1可以通过循环同步来解决.但是,如果在循环中调用外来代码(例如原因2),则这很糟糕.
问题2可以通过列表或地图的副本来解决.
这意味着列表或映射必须在循环之前复制到同步块中.有更好的解决方案吗?
一些示例代码:
public void todoSomeThings( Map<Abc, Object> map ){
for( Abc abc : map.keySet() ){
abc.todoSomeThings();
}
}
Run Code Online (Sandbox Code Playgroud)
您是否考虑过使用并发集合java.util.concurrent
?说实话,很难给出更好的建议,说实话......我们需要更多细节.
需要注意的一点是,如果您在线程之间共享可变集合,并且可变集合暴露于您的大量代码中,而您在迭代时不知道可能会对其进行哪些变更,那么您可能需要考虑如果可能,改变你的设计.不可变的集合通常可以保持清洁,有时(但不总是)以某些性能为代价.它们可能更难以开始使用,但您可能会发现之后更容易推理您的代码.
归档时间: |
|
查看次数: |
302 次 |
最近记录: |