Избежание исключения ConcurrentModificationException при использовании синхронизированных методов
Ошибка ConcurrentModificationException обычно возникает из-за изменений, внесенных в коллекцию, которую итератор выполняет в цикле тело. Несмотря на наличие ключевого слова Synchronized в объявлении метода, это исключение все равно можно встретить.
В предоставленном фрагменте кода:
public synchronized X getAnotherX(){ if(iterator.hasNext()){ X b = iterator.next(); String name = b.getInputFileName(); ... return b; } else{return null;} }
Вероятно, ошибка возникает, поскольку внешний поток изменяет базовую коллекцию, пока итератор выполняет итерацию по ней. Эта модификация может включать добавление или удаление элементов.
Решение этой проблемы состоит в том, чтобы гарантировать, что никакой другой поток не сможет изменить коллекцию во время итерации. Этого можно добиться, создав копию коллекции перед ее перебором. Однако если это невозможно, то итератор должен быть получен потокобезопасным способом. Это можно сделать с помощью метода Collections.synchronizedList() или создав собственную оболочку синхронизации для коллекции.
Выполняя эти шаги, вы можете гарантировать, что исключение ConcurrentModificationException не встретится и что коллекция будет повторяться. прошло благополучно.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3