我正在学习CopyOnWriteArrayList,按照我的理解,它不起作用。 我有两个线程,一个是主线程,另一个是内线程。主线程正在休眠5秒钟时从CopyOnWriteArrayList集合中删除对象。主线程在内部线程迭代之前就已经完成了删除操作,但是内部线程仍在迭代整个集合,我的意思是被主线程删除了。
package com.kalavakuri.javaconcurrent;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class ConcurrentModificationExceptionExample {
private static List<String> strings = new CopyOnWriteArrayList<String>();
public static void main(String[] args) {
strings.add("Ram");
strings.add("Ravi");
strings.add("Raju");
strings.add("Raghu1");
strings.add("Raghu2");
strings.add("Raghu3");
strings.add("Raghu4");
strings.add("Raghu5");
strings.add("Raghu6");
Thread thread = new Thread(() -> {
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
System.out.println("Thread name " + Thread.currentThread().getName());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Inner thread");
thread.start();
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
String value = iterator.next();
strings.remove(value);
System.out.println("Thread name " + Thread.currentThread().getName());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
strings.forEach(v -> System.out.println(v));
}
}
我期望内线程不应该迭代被主线程删除的对象。如果我的理解是错误的,请纠正我。
答案 0 :(得分:4)
是的,你错了。来自docs:
“快照”样式迭代器方法使用对状态的引用 创建迭代器时的数组。这个数组永远不会 在迭代器的生命周期内发生变化,因此干扰为 不可能,并且保证迭代器不会抛出 ConcurrentModificationException。
因此,根据设计,迭代器在其他线程进行更改时不会更改。