Найти в Дзене
DEBAGanov

Java 901. Напишите однопоточную программу, которая заставляет коллекцию выбросить ConcurrentModificationException.

Конкурирующая модификация (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