Почему исключение одновременной модификации выбрасывается? - PullRequest
0 голосов
/ 02 июня 2018

Я знаю, что исключение одновременной модификации выдается, когда коллекция структурно изменяется во время итерации, но почему?

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

, это может быть довольно простой вопрос, но мне нужен некоторый правильный сценарий, чтобы убедить себя, что проверка ConcurrentmodificationException абсолютно необходимо.

1 Ответ

0 голосов
/ 02 июня 2018

Это не «абсолютно необходимо», но помогает предотвратить ряд потенциальных ошибок, как в однопоточном, так и многопоточном коде.Предположим, например, что вы перебираете набор и добавляете или удаляете элемент - как должен это обрабатывать итератор?Нет явно правильного поведения (вы можете захотеть, чтобы оно появилось позже в итерации, а может и нет).

Чтобы избежать CME, вы, как правило, хотите использовать две отдельные коллекции - одну, которую вы повторяете итот, который вы мутируете.Это также часто приводит к более чистому коду, который легче рассуждать.В конкретном случае списков вы можете перебирать индексы (for (int i = 0; i < list.size(); i++)), но вы должны быть осторожны с тем, как i изменяется при изменении списка, чтобы не пропустить или не выполнить двойную итерацию по элементу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...