同期にもかかわらず ConcurrentModificationException が発生する
このコード スニペットでは、
public synchronized X getAnotherX() { if (iterator.hasNext()) { X b = iterator.next(); String name = b.getInputFileName(); ... return b; } else { return null; } }
の使用にもかかわらず ConcurrentModificationException がスローされます。同期キーワード。この例外は通常、マルチスレッドの問題ではなく、反復中の基になるコレクションへの変更によって発生します。
この特定の例では、iterator.hasNext() でコレクションを反復処理し、次の操作を試みたときにエラーが発生します。 iterator.next() で要素にアクセスします。この反復の進行中に、要素の追加や削除など、基礎となるコレクションが変更されると、ConcurrentModificationException が発生する可能性があります。
解決策は、反復中にコレクションの変更を回避することです。これは、コレクションのコピーを作成するか、反復ループ内でこれらの変更を明示的にチェックして処理することによって実現できます。さらに、コレクション型が ListIterator をサポートしている場合、このインターフェイスは反復中の挿入と削除を管理するための追加メソッドを提供します。
以上がJava で `synchronized` を使用しているにもかかわらず `ConcurrentModificationException` が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。