Я пытался под кодом ниже.Модифицируя 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 иногда и время от времени работает успешно.
Что я не понимаю, так как существует два разных метода, каждый из которых содержит один поток. Они будут выполняться один за другим. Когда один поток заканчивает изменение списка, Thread 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