Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでコレクションを反復処理するときにConcurrentModificationExceptionを回避するにはどうすればよいですか?


コレクションオブジェクトを操作しているときに、1つのスレッドが特定のコレクションオブジェクトを反復処理しているときに、そのオブジェクトから要素を追加または削除しようとすると、ConcurrentModificationExceptionがスローされます。

それだけでなく、コレクションオブジェクトを反復処理している場合は、要素を追加または削除してその内容を再度反復しようとすると、複数のスレッドを使用してコレクションオブジェクトにアクセスしようとしていると見なされ、ConcurrentModificationExceptionがスローされます。

import java.util.ArrayList;
import java.util.Iterator;
public class OccurenceOfElements {
   public static void main(String args[]) {
      ArrayList <String> list = new ArrayList<String>();
      //Instantiating an ArrayList object
      list.add("JavaFX");
      list.add("Java");
      list.add("WebGL");
      list.add("OpenCV");
      System.out.println("Contents of the array list (first to last): ");
      Iterator<String> it = list.iterator();
      while(it.hasNext()) {
         System.out.print(it.next()+", ");
      }
      //list.remove(3);
      list.add(3, "Hadoop");
      while(it.hasNext()) {
         System.out.print(it.next()+", ");
      }
   }
}

出力

Contents of the array list (first to last):
JavaFX, Java, WebGL, OpenCV, Exception in thread "main"
java.util.ConcurrentModificationException
   at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
   at java.util.ArrayList$Itr.next(Unknown Source)
   at sample.OccurenceOfElements.main(OccurenceOfElements.java:23)

複数のスレッドからコレクションオブジェクトにアクセスしているときにこれを解決するには、同期されたブロックまたはメソッドを使用します。データの取得中にデータを変更する場合は、データを変更した後にIteratorオブジェクトを再度取得します。

import java.util.ArrayList;
import java.util.Iterator;
public class OccurenceOfElements {
   public static void main(String args[]) {
      ArrayList <String> list = new ArrayList<String>();
      //Instantiating an ArrayList object
      list.add("JavaFX");
      list.add("Java");
      list.add("WebGL");
      list.add("OpenCV");
      System.out.println("Contents of the array list (first to last): ");
      Iterator<String> it = list.iterator();
      while(it.hasNext()) {
         System.out.print(it.next()+". ");
      }
      list.remove(3);
      System.out.println("");
      System.out.println("Contents of the array list after removal: ");
      it = list.iterator();
      while(it.hasNext()) {
         System.out.print(it.next()+". ");
      }
   }
}

出力

Contents of the array list (first to last):
JavaFX. Java. WebGL. OpenCV.
Contents of the array list after removal:
JavaFX. Java. WebGL.

  1. コレクションとJavaのコレクションの違いは?

    コレクション はインターフェースですが、コレクション ユーティリティです Javaのクラス。 セット、リスト、 およびキュー コレクションのサブインターフェイスの一部です インターフェース、マップ インターフェースもコレクションの一部です フレームワークですが、コレクションを継承しません インターフェース。 収集の重要な方法 インターフェースはadd()、remove()、size()、clear() などとコレクション クラスには静的のみが含まれます sort()、min()、max()、fill()、copy()、reverse()などのメソッド など コレクションインターフェイスの構文

  2. Javaでのデッドロックを回避するにはどうすればよいですか?

    Javaでは、デッドロック 2つ以上のスレッドが永久にブロックされるプログラミング状況です。 。デッドロック状態は、少なくとも2つのスレッドで発生します および2つ以上のリソース 。 デッドロックを回避する方法 ネストされたロックを回避する :デッドロックは主に、複数のスレッドにロックを与えるときに発生します。すでに1つにロックしている場合は、複数のスレッドにロックを与えることは避けてください。 不要なロックを回避する :必要なメンバーだけをロックできます。不必要にロックをかけると、デッドロックが発生する可能性があります。 Thread.join()の使用: デッドロック状態は、一方のス