2

Я бегу этот код в отдельном потоке (не UI Thread)ConcurrentModificationException в цикле

strains = new ArrayList<Strain>(); 
for (Breeder b : breeders) { 
    for (Strain s : b.getStrains()) { 
     strains.add(s); 
    } 
} 

Это иногда вызывает ConcurrentModificationException. Я знаю, что я не могу добавить или удалить объект из коллекции, которую я итерирую, но в этом фрагменте я не повторяю штаммы. Где я ошибаюсь? Thanks

ответ

1

Synchronize ваш доступ. Этот вид замораживает текущий объект breeder, так что он не будет изменен ни в какой другой теме. Методы, которые пытаются сделать это, будут заблокированы. Заблокированные означает, что они просто ждут (например, System.sleep (x)), пока не будет обработан блок synchronized в другом потоке.

synchronized(breeders) { 
    for (Breeder b : breeders) { 
     for (Strain s : b.getStrains()) { 
      strains.add(s); 
     } 
    } 
} 

Убедитесь, что вы также положить synchronized вокруг доступа других потоков в breeders.

+1

Это может быть проблемой. Или это может быть петля над штаммами селекционеров. Но синхронизация доступа ничего не изменит, если все потоки не будут делать то же самое при каждом доступе к коллекции. Он должен быть инкапсулирован внутри класса. –

+0

Я пробовал синхронизировать доспехи, но никакой помощи .. Исключение увольняют здесь «для (Breeder b: заводчики)» – TheModularMind

Смежные вопросы