Это исключение может быть вызвано методами, обнаружившими одновременное
модификация объекта, когда такая модификация недопустима.
Например, изменение одного потока, как правило, недопустимо
Коллекция, в то время как другой поток перебирает ее. В общем,
результаты итерации при этих обстоятельствах не определены.
Некоторые реализации Iterator (включая те из всех общих
реализации целевого сбора, предоставленные JRE) может выбрать
бросить это исключение, если это поведение обнаружено. Итераторы, которые делают
они известны как итераторы с быстрым отказом, так как они быстро и
чисто, скорее, рискуя произвольным, недетерминированным поведением в
неопределенное время в будущем.
Обратите внимание, что это исключение не всегда означает, что объект имеет
был одновременно изменен другим потоком. Если один поток
выдает последовательность вызовов методов, которая нарушает контракт
объект, объект может вызвать это исключение. Например, если
поток изменяет коллекцию напрямую, пока он выполняет итерацию
коллекция с отказоустойчивым итератором, итератор сгенерирует это
исключение.
Обратите внимание, что отказоустойчивое поведение не может быть гарантировано как обычно
говоря, невозможно сделать какие-либо жесткие гарантии в присутствии
несинхронизированная одновременная модификация. Отказоустойчивые операции броска
ConcurrentModificationException на основе максимальных усилий. Следовательно, это
было бы неправильно писать программу, которая зависела от этого исключения для
его правильность: следует использовать только ConcurrentModificationException
обнаруживать ошибки.
Потенциальное решение: вместо добавления непосредственно в итерируемый список, добавьте его во временный список, а затем по окончании итерации выполните addAll()
.