Конкурирующая модификация (ConcurrentModificationException) возникает, когда коллекция изменяется во время итерации без использования соответствующих механизмов синхронизации. Вот пример однопоточной программы, которая вызывает ConcurrentModificationException:
import java.util.ArrayList;
import java.util.List;
public class ConcurrentModificationExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
for (Integer number : numbers) {
numbers.remove(number); // Изменение коллекции во время итерации }
}
}
В этом примере мы создаем список numbers и добавляем в него несколько элементов. Затем мы выполняем итерацию по списку с помощью цикла for-each и пытаемся удалить каждый элемент из списка внутри цикла. Это вызывает ConcurrentModificationException, потому что мы изменяем список во время итерации.
Чтобы избежать ConcurrentModificationException, следует использовать итератор и его методы для добавления или удаления элементов. Например:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ConcurrentModificationExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
iterator.remove(); // Используем метод remove() итератора для удаления элемента }
}
}
В этом примере мы используем итератор для обхода списка numbers. Метод iterator.remove() позволяет безопасно удалять элементы из коллекции во время итерации, и это не вызывает ConcurrentModificationException.
Обратите внимание, что настоящая потребность в использовании ConcurrentModificationException возникает в многопоточных сценариях, когда несколько потоков одновременно модифицируют одну коллекцию. В однопоточных сценариях использование ConcurrentModificationException неразумно и может указывать на ошибку в логике программы.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov