我在下面的代碼嘗試。雖然用一個線程修改ArrayList並用另一個線程迭代它,但它拋出ConcurrentModificationException
public class IteratorFailFastTest {
private List<Integer> list = new ArrayList<>();
public IteratorFailFastTest() {
for (int i = 0; i < 10; i++) {
list.add(i);
}
}
public void runUpdateThread() {
Thread thread2 = new Thread(new Runnable() {
public void run() {
for (int i = 10; i < 20; i++) {
list.add(i);
}
}
});
thread2.start();
}
public void runIteratorThread() {
Thread thread1 = new Thread(new Runnable() {
public void run() {
ListIterator<Integer> iterator = list.listIterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
System.out.println(number);
}
}
});
thread1.start();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
IteratorFailFastTest tester = new IteratorFailFastTest();
tester.runIteratorThread();
tester.runUpdateThread();
}
}
它有時拋出ConcurrentModificationException並且有時會成功運行。
我不明白的是,因爲有2個不同的方法,每個包含一個線程。他們將一一執行。當一個線程完成修改列表時,線程2將開始迭代。
我也提到這個鏈接(Why no ConcurrentModificationException when one thread iterating (using Iterator) and other thread modifying same copy of non-thread-safe ArrayList),但它是不同的情況。
那麼,它爲什麼拋出這個異常?是因爲線程嗎?
有人可以解釋一下嗎?
請不要鏈接到代碼/文章。編輯您的問題以包含實際的代碼片段。 – Bohemian
@Bohemian:我編輯了這篇文章。 –
應該沒有CME:迭代器被創建但沒有被使用 – Bohemian