ホームページ  >  記事  >  Java  >  Synchronized を使用している場合でも ConcurrentModificationException が発生するのはなぜですか?

Synchronized を使用している場合でも ConcurrentModificationException が発生するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-06 01:35:02582ブラウズ

Why Do I Get a ConcurrentModificationException Even When Using Synchronized?

Synchronized 使用時の ConcurrentModificationException

getAnotherX メソッドの同期にもかかわらず、iterator.next() の呼び出し時に ConcurrentModificationException 例外が発生します。これが発生する理由を理解するには、ConcurrentModificationException の性質を理解することが重要です。

ConcurrentModificationException の性質

その名前に反して、ConcurrentModificationException は主に複数のスレッドによって引き起こされるわけではありません。 。この問題は、反復ループ内で反復されるコレクションを変更するときによく発生します。以下に例を示します。

Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
    Item item = (Item) iterator.next();
    if (item.satisfiesCondition()) {
       collection.remove(item);
    }
}

このシナリオでは、collection.remove(item) の代わりに iterator.remove() を使用することが不可欠です。この例外は、コレクションに追加するときにも発生する可能性があります。残念ながら、このケースに対する一般的な解決策はありません。ただし、List を扱う場合は、add() メソッドを持つ ListIterator を使用できます。

以上がSynchronized を使用している場合でも ConcurrentModificationException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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