#java
#java
Вопрос:
Я поймал исключение при многопоточном программировании.
Сначала я это увидел, но не знаю, как это решить.
затем я ищу ConcurrentModificationException, затем он говорит
ConcurrentModificationException следует использовать только для обнаружения ошибок
Что это значит? Может быть, там написано «вы должны перехватить только это исключение», не так ли?? или нет??
Должен ли я это решить??
Ответ №1:
Javadoc объясняет обстоятельства, которые обычно приводят к этому исключению:
Это исключение может быть вызвано методами, которые обнаружили одновременную модификацию объекта, когда такая модификация недопустима.
Например, обычно недопустимо, чтобы один поток изменял коллекцию, в то время как другой поток выполняет итерацию по ней. В общем случае результаты итерации не определены при этих обстоятельствах. Некоторые реализации итераторов (включая реализации всех коллекций, предоставляемых JRE) могут выбрать выдачу этого исключения, если обнаружено такое поведение. Итераторы, которые делают это, известны как итераторы с быстрым отказом, поскольку они быстро и чисто завершаются сбоем, а не рискуют произвольным, недетерминированным поведением в неопределенное время в будущем.
В этом документе «ConcurrentModificationException следует использовать только для обнаружения ошибок» означает, что вы не должны перехватывать его в своем коде и пытаться восстановить. Вы должны отследить ошибку, которая ее вызывает, и исправить ошибку.
Ответ №2:
ConcurrentModificationException
часто возникает, когда вы изменяете коллекцию во время итерации по ее элементам.
Да, вам нужно найти ошибку и устранить проблему.
Попробуйте выяснить, вносите ли вы изменения во время итерации или какой-либо другой поток участвует в изменении коллекции. Вам нужно разобраться.
Не могли бы вы опубликовать свой код, пожалуйста?
Ответ №3:
Вы никогда не должны перехватывать это исключение. Вы должны выяснить, почему генерируется исключение, и исправить код. Также обратите внимание, что это исключение не будет выдаваться каждый раз. Поэтому, если вы протестируете один раз и исключение исчезнет, у вас все равно могут возникнуть проблемы. Лучший способ справиться с этим — написать хорошие параллельные тестовые примеры. Это все еще не пуленепробиваемый, но это лучшее, что вы можете.
Подводя итог, да, вам нужно решить исключение, и сделать это правильно может быть довольно сложно. Если вы имеете дело с производственным кодом, я рекомендую обратиться за помощью к вашему коду.