リストまたはマップを反復処理するためのコードシーケンスは、ConcurrentModificationExceptionを防止しますか?私たちはコード内で繰り返して散発的なConcurrentModificationExceptionを持っています。問題の原因は2つあります。Javaでの散発的なConcurrentModificationExceptionを防ぐベストプラクティスは何ですか?
- 別のスレッド変化
- リストを変更してループ内で呼び出されるメソッドを反復のリスト。
問題1は、ループの周りで同期して解決することができます。しかし、原因2のようにループ内でエイリアンコードが呼び出された場合、これは悪いことです。
問題2は、リストまたはマップのコピーで解決できます。
これは、リストまたはマップが、ループの前に同期ブロックにコピーされている必要があることを意味します。より良い解決策がありますか?
いくつかのサンプルコード:
public void todoSomeThings(Map<Abc, Object> map){
for(Abc abc : map.keySet()){
abc.todoSomeThings();
}
}
ほとんどの場合、パラメータであるためリストまたはマップのタイプを変更することはできません。 – Horcrux7
@ Horcrux7:メソッドが(ArrayListの代わりに 'List'のように)できるだけ一般的な引数として取るべき理由を示す素晴らしい例です。 –