1

ConcurrentModificationException を防ぐリストまたはマップの反復処理のコード シーケンスはどれですか? 私たちのコードには、繰り返し散発的に ConcurrentModificationException があります。問題の原因は 2 つあります。

  1. 別のスレッドが反復時にリストを変更します
  2. ループ内で呼び出されるメソッドがリストを変更しています。

問題 1 は、ループを同期させることで解決できます。しかし、原因 2 のようにループ内でエイリアン コードが呼び出された場合、これは良くありません。

問題 2 は、リストまたはマップのコピーで解決できます。

これは、ループの前にリストまたはマップを同期ブロックにコピーする必要があることを意味します。より良い解決策はありますか?

サンプルコード:

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

2 に答える 2

7

で並行コレクションを使用することを検討しましたjava.util.concurrentか? 正直なところ、それ以上のアドバイスをするのは難しいです...もっと詳細が必要です.

注意すべき点の 1 つは、変更可能なコレクションがスレッド間で共有されていて、変更可能なコレクションが非常に多くのコードに公開されているため、反復中に何が変更されているのかわからない場合は、検討することをお勧めします。可能であればデザインを変更します。不変コレクションは、多くの場合、パフォーマンスをいくらか犠牲にして (常にではありませんが) 物事をよりクリーンに保つことができます。最初は扱いにくいかもしれませんが、後でコードを推論する方が簡単であることに気付くでしょう。

于 2011-01-11T07:53:25.493 に答える
3

公正な警告: juc (java.util.concurrent) を使用するとエラーは解消されますが、競合の更新、古い読み取りなどの最悪のケースが発生する可能性があります。ベスト プラクティスは次のとおりです。

データ構造を理解し、状態を使用するか、少なくとも (これは最善ではありませんが) ロックを使用します。

于 2011-01-11T10:12:26.590 に答える