ホームページ  >  記事  >  Java  >  Java で `synchronized` を使用しているにもかかわらず `ConcurrentModificationException` が発生するのはなぜですか?

Java で `synchronized` を使用しているにもかかわらず `ConcurrentModificationException` が発生するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-07 01:32:03930ブラウズ

Why Does a `ConcurrentModificationException` Occur Despite Using `synchronized` in Java?

同期にもかかわらず 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。