ConcurrentModificationException возникает в Java, когда изменяется коллекция (например, список или карта) в то время, когда итератор работает с этой коллекцией. Это исключение обычно возникает в многопоточных средах, когда один поток модифицирует коллекцию, а другой поток пытается ее итерировать или использовать.
Давайте рассмотрим пример кода, который приводит к ConcurrentModificationException:
java
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for(Integer number : list) {
if(number == 2) {
list.remove(number); // Модификация списка во время итерации
}
}
В этом примере, когда итератор проходит по списку и встречает число 2, мы пытаемся удалить это число из списка. Однако, это вызывает ConcurrentModificationException, потому что мы модифицируем список во время итерации.
Чтобы избежать этой ошибки, можно использовать Iterator или ListIterator для итерации по коллекции и удаления элементов. Пример:
java
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
Integer number = iterator.next();
if(number == 2) {
iterator.remove(); // Использование Iterator для удаления элемента
}
}
Примечание: Это только один из многих возможных примеров кода, приводящих к ConcurrentModificationException. Использование потоков, параллельных потоков или неправильно синхронизированных коллекций также может вызвать это исключение. Чтобы избежать его, следует тщательно проверять свою логику и обеспечивать правильную синхронизацию при работе с коллекциями в многопоточной среде.
ConcurrentModificationException возникает в Java, когда изменяется коллекция (например, список или карта) в то время, когда итератор работает с этой коллекцией. Это исключение обычно возникает в многопоточных средах, когда один поток модифицирует коллекцию, а другой поток пытается ее итерировать или использовать.
Давайте рассмотрим пример кода, который приводит к ConcurrentModificationException:
java
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for(Integer number : list) {
if(number == 2) {
list.remove(number); // Модификация списка во время итерации
}
}
В этом примере, когда итератор проходит по списку и встречает число 2, мы пытаемся удалить это число из списка. Однако, это вызывает ConcurrentModificationException, потому что мы модифицируем список во время итерации.
Чтобы избежать этой ошибки, можно использовать Iterator или ListIterator для итерации по коллекции и удаления элементов. Пример:
java
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
Integer number = iterator.next();
if(number == 2) {
iterator.remove(); // Использование Iterator для удаления элемента
}
}
Примечание: Это только один из многих возможных примеров кода, приводящих к ConcurrentModificationException. Использование потоков, параллельных потоков или неправильно синхронизированных коллекций также может вызвать это исключение. Чтобы избежать его, следует тщательно проверять свою логику и обеспечивать правильную синхронизацию при работе с коллекциями в многопоточной среде.