Looking for java Keywords? Try Ask4Keywords

Java Language Pitfall: исключения одновременной модификации


пример

Это исключение возникает, когда коллекция модифицируется во время итерации по ней с использованием методов, отличных от тех, которые предоставляются объектом итератора. Например, у нас есть список шляп, и мы хотим удалить все те, которые имеют ушные заслонки:

List<IHat> hats = new ArrayList<>();
hats.add(new Ushanka()); // that one has ear flaps
hats.add(new Fedora());
hats.add(new Sombrero());
for (IHat hat : hats) {
    if (hat.hasEarFlaps()) {
        hats.remove(hat);
    }
}

Если мы запустим этот код, ConcurrentModificationException будет поднят, так как код изменяет коллекцию при ее итерации. Такое же исключение может возникнуть, если один из нескольких потоков, работающих с одним и тем же списком, пытается изменить коллекцию, а другие перебирают ее. Одновременная модификация коллекций в нескольких потоках является естественной вещью, но ее следует обрабатывать с помощью обычных инструментов из параллельного инструментария программирования, таких как блокировки синхронизации, специальные коллекции, принятые для одновременной модификации, изменение клонированной коллекции с начального и т. Д.