ホームページ >Java >&#&チュートリアル >Java の同時実行例外 - java.util.ConcurrentModificationException をどうするか?

Java の同時実行例外 - java.util.ConcurrentModificationException をどうするか?

王林
王林オリジナル
2023-06-25 11:46:391212ブラウズ

Java は高級言語として、プログラミング言語で広く使用されています。 Java アプリケーションやフレームワークの開発では、並行性の問題がよく発生します。同時実行性の問題とは、複数のスレッドが同じオブジェクトに対して同時に動作すると、予期しない結果が発生することを意味します。これらの問題は同時実行性の問題と呼ばれます。一般的な例外の 1 つは java.util.ConcurrentModificationException 例外ですが、開発プロセス中にこの例外を効果的に解決するにはどうすればよいでしょうか?

Java.util.ConcurrentModificationException は、コレクションの走査中に他のスレッドがコレクションの構造を変更した場合にスローされる実行時例外です。簡単に言うと、あるスレッドが Collection クラスのイテレータを使用してコレクションを走査しているときに、別のスレッドがコレクションを変更すると、イテレータが異常に動作し、最終的に例外がスローされます。この例外はプログラムの異常実行やクラッシュの原因となるため、この例外の解決は開発中に解決する必要のある緊急の問題です。

次に、次のメソッドを使用して java.util.ConcurrentModificationException 例外を解決します。

1. Iterator を使用してコレクションを走査する

Java では、コレクション (List、Set、Map) はすべて Iterable インターフェイスを実装しており、代わりに Iterator を使用して走査できます。この例外が発生します。イテレータを使用してコレクションを走査する場合、コレクション構造の変更を記録するイテレータ内に変数 modCount が存在するため、イテレータの modCount 値がコレクションの modCount 値と矛盾していることが判明すると、ConcurrentModificationException 例外が発生します。これにより、収集中のコレクションの追加、削除、および変更を効果的に回避できます。

サンプル コード:

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String str = iterator.next();
    //...
}

2. 同期には Collections.synchronizedList() メソッドを使用します

Collections.synchronizedList() メソッドは、List コレクションをスレッドに変えることができます。安全なコレクション。List コレクションが同時に変更されると、ConcurrentModificationException を避けるために List がロックされます。ただし、このメソッドはオブジェクト レベルのロックを使用するため、パフォーマンスに影響を与える可能性があります。

サンプル コード:

List<String> list = new ArrayList<>();
List<String> synchronizedList = Collections.synchronizedList(list);

3. CopyOnWriteArrayList を使用する

CopyOnWriteArrayList は、Java 5 の新しいスレッドセーフ クラスです。その設計上の考え方は、多くの読み取りがある場合に CopyOnWriteArrayList を使用することです。操作と書き込み操作が行われます。操作が少ない状況では、コピー メカニズムが使用されます。書き込み操作がある場合は、変更のために新しい配列がコピーされ、古い配列で読み取り操作が実行されるため、次の問題が回避されます。複数のスレッドによる同時アクセス時のデータの不整合。

サンプル コード:

CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

概要:

Java 開発では、データ競合によって引き起こされる同時実行の問題を回避するために、同時実行の概念と関連知識を完全に理解する必要があります。上記は java.util.ConcurrentModificationException 例外を解決するためのいくつかのメソッドですが、メソッドが異なれば適用可能なシナリオも異なるため、特定の状況に応じて選択する必要があります。同時に、並行開発プロセス中は、プログラムの正確さと効率を確保するために、スレッド セーフ、ロックの使用、デッドロックなどの問題にも注意を払う必要があります。

以上がJava の同時実行例外 - java.util.ConcurrentModificationException をどうするか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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