Computer >> Máy Tính >  >> Lập trình >> Java

Làm cách nào để tránh ConcurrentModificationException khi lặp lại một bộ sưu tập trong java?

Khi bạn đang làm việc với các đối tượng bộ sưu tập, trong khi một luồng đang lặp lại trên một đối tượng bộ sưu tập cụ thể, nếu bạn cố gắng thêm hoặc xóa các phần tử khỏi nó, một ConcurrentModificationException sẽ được ném ra.

Không chỉ vậy, nếu bạn đang lặp lại một đối tượng bộ sưu tập, thêm hoặc xóa các phần tử của nó và cố gắng lặp lại nội dung của nó thì điều đó được coi là bạn đang cố gắng truy cập đối tượng bộ sưu tập bằng nhiều luồng và ConcurrentModificationException được ném.

Ví dụ

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()+", ");
      }
   }
}

Đầu ra

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)

Để giải quyết vấn đề này trong khi truy cập các đối tượng thu thập từ nhiều luồng, hãy sử dụng khối hoặc phương thức được đồng bộ hóa và nếu bạn đang sửa đổi dữ liệu trong khi truy xuất nó, hãy tải lại đối tượng Iterator sau khi sửa đổi dữ liệu.

Ví dụ

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()+". ");
      }
   }
}

Đầu ra

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