public class TestArrayList {
public static ArrayList< String > arrayList = new ArrayList<String>();
public TestArrayList(){
this.arrayList.add("A");
this.arrayList.add("B");
this.arrayList.add("C");
this.arrayList.add("D");
}
public static void main(String[] args){
TestArrayList testArrayList = new TestArrayList();
Iterator<String> iterator = arrayList.iterator();
while(iterator.hasNext()){
String string= iterator.next();
arrayList.add("E");
}
}
}
执行以上代码会抛出java.util.ConcurrentModificationException错误。这是因为主线程在遍历list的时候,子线程在向list中添加元素.。
解决方法:将ArrayList替换为CopyOnWriteArrayList。因为CopyOnWriteArrayList类最大的特点就是,在对其实例进行修改操作(add/remove等)会新建一个数据并修改,修改完毕之后,再将原来的引用指向新的数组。这样,修改过程没有修改原来的数组。也就没有了ConcurrentModificationException错误。
在java.util.concurrent包中,除了CopyOnWriteArrayList类,也还有这样一个类CopyOnWriteArraySet。CopyOnWriteArraySet的实现是完全基于CopyOnWriteArrayList的