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

Patricia Arquette
リリース: 2024-11-09 01:56:02
オリジナル
256 人が閲覧しました

Why Do I Get ConcurrentModificationException Even When Using `synchronized`?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート