Synchronized を使用しているにもかかわらず ConcurrentModificationException が発生するのはどうすればよいですか?
synchronized キーワードを使用すると、同時実行の問題がすべて回避されると考えるのが一般的です。ただし、一度に 1 つのスレッドが同期されたコード ブロックにアクセスできることが保証されるだけです。反復されるコレクションへの変更は妨げられません。
次のコードを考えてください:
public synchronized X getAnotherX() { if (iterator.hasNext()) { X b = iterator.next(); String name = b.getInputFileName(); ... return b; } else { return null; } }
同期宣言ヘッダーは、メソッド全体が一度に 1 つのスレッドによって実行されることだけを保証します。時間。ただし、反復子がアクセスしているコレクションが他のスレッドによって変更されるのを防ぐことはできません。
ConcurrentModificationException が発生する理由
ConcurrentModificationException は通常、変更を行うときに発生します。反復ループ内で反復されるコレクション。たとえば、次のコードはこの例外を引き起こします:
Iterator iterator = collection.iterator(); while (iterator.hasNext()) { Item item = (Item) iterator.next(); if (item.satisfiesCondition()) { collection.remove(item); } }
この場合、代わりに iterator.remove() メソッドを使用して要素を削除する必要があります。コレクションに追加する必要がある場合、同期メソッドに依存することはできません。ただし、リストを扱う場合は、add() メソッドを提供する ListIterator サブタイプを使用できます。
以上が「synchronized」を使用している場合でも ConcurrentModificationException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。