Из кода
for (Project persist: projectList) {
persist.setProjectId("K7890");
persist.setName(fileName);
myDAO.saveProjects(projectList);
}
projectList.clear(); // <-- clear might cause to this Exception
Справка
Почему при использовании итератора возникает исключение ConcurrentModificationException?
Классы java.util Collection
работают без сбоев, что означает, что если один поток изменяет коллекцию, в то время как другой поток просматривает ее с помощью итератора, вызов iterator.hasNext()
или iterator.next()
вызовет ConcurrentModificationException
.
Даже классы-оболочки синхронизированной коллекции SynchronizedMap
и SynchronizedList
являются только условно-поточно-ориентированными, что означает, что все отдельные операции являются поточно-ориентированными, но составные операции, в которых поток управления зависит от результатов предыдущих операций, могут быть связаны с проблемами многопоточности. (List myList = Collections.synchronizedList (myList)
! Здесь может не работать)
Решения для ситуаций с многопоточным доступом
Решение 1. Вы можете преобразовать свой список в массив с помощью list.toArray()
и выполнить итерацию по массиву. Этот подход не рекомендуется, если список большой.
Решение 2. Вы можете заблокировать весь список во время итерации, заключив код в синхронизированный блок. Этот подход отрицательно сказывается на масштабируемости вашего приложения, если оно очень параллельно.
Решение 3. Вы можете использовать классы ConcurrentHashMap
и CopyOnWriteArrayList
, которые обеспечивают гораздо лучшую масштабируемость, а итератор, возвращаемый ConcurrentHashMap.iterator()
, не будет генерировать ConcurrentModificationException
при сохранении безопасности потоков.
Решение для ситуации с однопоточным доступом
Использовать:
it.remove();
Он удаляет текущий объект через итератор it
, который ссылается на вашу базовую коллекцию list
.
Избегать:
list.remove(myObject);
person
Maxim Shoustin
schedule
27.10.2013
commitObjects(prj)
? Это как-то модифицируетList<Project> proj
? - person Hovercraft Full Of Eels   schedule 28.10.2013callablestatement
тип? - person Maxim Shoustin   schedule 28.10.2013callablestatement
- тип подключения к базе данных. - person Jacob   schedule 28.10.2013saveProjects
? - person Maxim Shoustin   schedule 28.10.2013Collections.unmodifiableList(...)
перед повторением по нему? Вы вызываете что-то одновременно? - person Ortwin Angermeier   schedule 28.10.2013projectList
. 1-й циклfor (Project persist: projectList) {
и после того, как вы снова запуститеsaveProjects
- person Maxim Shoustin   schedule 28.10.2013