Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

จะหลีกเลี่ยง ConcurrentModificationException ขณะทำซ้ำคอลเล็กชันใน java ได้อย่างไร


เมื่อคุณทำงานกับวัตถุคอลเลกชัน ขณะที่หนึ่งเธรดกำลังวนซ้ำวัตถุคอลเลกชันใด ๆ หากคุณพยายามเพิ่มหรือลบองค์ประกอบออกจากมัน 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.