«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как избежать ConcurrentModificationException при использовании синхронизированных методов?

Как избежать ConcurrentModificationException при использовании синхронизированных методов?

Опубликовано 24 ноября 2024 г.
Просматривать:718

How to Avoid `ConcurrentModificationException` When Using Synchronized Methods?

Избежание исключения 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