Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java에서 컬렉션을 반복하는 동안 ConcurrentModificationException을 피하는 방법은 무엇입니까?

<시간/>

컬렉션 개체로 작업할 때 한 스레드가 특정 컬렉션 개체를 반복하는 동안 요소를 추가하거나 제거하려고 하면 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.