プログラム全体のすべてのメソッド(静的メソッドとメソッドを含む)を同期させたConcurrentModificationException
にもかかわらず、main
非表示のイテレータはありません。
- それはどのように可能ですか?
- どういう意味ですか?
- どうすれば修正できますか?
プログラム全体のすべてのメソッド(静的メソッドとメソッドを含む)を同期させたConcurrentModificationException
にもかかわらず、main
非表示のイテレータはありません。
ConcurrentModificationException
スレッドによって発生する可能性がありますIterator.remove()
またはListIterator.add()
メソッドを使用する場合を除き、コレクションを反復処理中にコレクションを変更しないことを意味します。コレクションを繰り返し処理しているときにこの例外が発生し、その間にこのコレクションからエントリを削除します。
例えば
Collection<Object> objects = new ArrayList<Objects>(Arrays.asList("a","b"));
for (Object o : objects) {
objects.remove(o); //throws exception
}
削除したいものを別のコレクションに追加し、リストの反復処理が終了したら削除する必要があります。それ以外の場合は、 iterator() を介してオブジェクト コレクションを反復処理し、現在の反復子で remove() を呼び出します。
ConcurrentModificationException は同期とは関係ありません。
コレクションを反復しながらコレクションを変更することに関連しています。Lie Ryan が指摘しているように、完全なスタック トレースは、どのようにして取得したかを指摘するのに役立ちます。
通常、これを修正するには、反復処理中にコレクション自体を変更しないでください。
これを実行すると
List<Object> list = new ArrayList<Object>();
for(Object obj : list)
list.remove(obj);
商品化されます。適切な関数を使用せずにコレクションを反復処理中にコレクションを変更することはできません。
これは、次の方法で解決できます。
List<Object> list = new ArrayList<Object>();
for(Iterator<Object> itr = list.iterator(); itr.hasNext();)
itr.remove();
まず第一に、あなたがそれを見ているなら、それは可能です: 鳥の本と鳥が一致しない場合、鳥を信じてください.
さて、それはどのように起こりますか?コードを見ずに正確に言うのは難しいですが、例外スタックトレースはそれが発生した場所を指します。その周りに何が見えますか?
一般に、明らかに同時アクセスがある場合に発生します。それが起こっている場所を見つけたら、どのスレッドがそこに到達している可能性があるかを自問してください。
ConcurrentModificationExceptionの javadoc には答えが含まれています。
この例外は、オブジェクトが別のスレッドによって同時に変更されたことを常に示すわけではないことに注意してください。1 つのスレッドが、オブジェクトのコントラクトに違反する一連のメソッド呼び出しを発行すると、オブジェクトはこの例外をスローする可能性があります。たとえば、フェイルファスト反復子を使用してコレクションを反復処理しているときに、スレッドがコレクションを直接変更すると、反復子はこの例外をスローします。
それを修正する方法は、それをしないことです。
つまり、(他の人が指摘したように)反復と変更を同時に行う必要がある場合は、コレクションを直接変更するのではなく、反復子によって提供されるメソッドを使用してください。
同期されたメソッドは、実行中のオブジェクト インスタンスをロックします。
オブジェクト A と B が同じコレクションにアクセスする場合、A#doStuff と B#doStuff が同期されているかどうかは問題ではなく、同時に実行できます。
コレクションをロックするには、おそらくコレクション自体をロックする必要があります: メソッド本体の synchronized(collection) 、または Java 5 ミューテックス (より良い)。
(それと、他の人が指摘しているように、単一のスレッドでも ConcurrentModificationException を持つことができるという事実)。