在 Java 中迭代集合时如何避免并行修改异常?
当你使用集合对象时,如果某线程遍历某个特定集合对象时,如果你尝试添加或移除其中的元素,则会抛出一个并行修改异常。
不仅如此,如果你遍历一个集合对象,向其添加或移除元素,并尝试再次遍历其内容,则认为你正尝试使用多线程访问集合对象,并且会抛出一个并行修改异常。
示例
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)
要解决此问题,在从多个线程访问集合对象时,使用同步块或方法;如果你在检索数据时正在修改数据,则在修改数据后再次获取迭代器对象。
示例
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.
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP