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 サイトの他の関連記事を参照してください。