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