Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách tránh ConcurrentModificationException khi duyệt collection trong Java


Khi làm việc với collection object, nếu một thread đang duyệt collection mà thread khác thêm/xóa phần tử, ConcurrentModificationException ném ra.

Không chỉ vậy, nếu bạn đang duyệt collection, thêm/xóa phần tử và thử duyệt lại, coi như truy cập collection từ nhiều thread và ném ConcurrentModificationException.

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

Kết quả

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: dùng synchronized block/method khi truy cập collection từ nhiều thread, hoặc nếu sửa dữ liệu khi đọc, lấy Iterator object lại sau khi sửa.

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

Kết quả

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