Хорошо, поэтому я помещаю все это в комментарии, но я думаю, что это становится слишком длинным, чтобы положить туда, вот и вот ответ.
Что у вас есть это стенография способ сделать
for(Object obj: objs){ ... }
, который в своей очереди, является сокращенным способом получения итератора и итерации по коллекции. Iterator
, который обрабатывает коллекцию, несет ответственность за выброшенные исключения. Итератор ArrayList действительно бросает исключение ConcurrentModificationException, когда к нему открывается итератор после его изменения. Поэтому, если ваш код делает это, тогда да. В противном случае нет.
ПРИМЕЧАНИЕ: ConcurrentModificationException
, хотя содержащий слово Concurrent не обязательно имеет какое-либо отношение к многопоточности. Это очень важное различие. Вы можете получить ConcurrentModificationException
быть выброшен просто просто сделать это:
objs.forEach(obj -> {objs.remove(0)});
Это правда, что множественная Thread
s делает это также может привести к этому, но исключение на самом деле не имеет ничего общего с многопоточности. ConcurrentModificationException
просто означает, что ArrayList
был изменен одновременно во время его доступа, где одновременный в этом контексте означает в то же время, а не более традиционный вычислительный смысл многопоточности.
EDIT:
Я видел комментарий вы сделали о защите его, а также еще про то, что в Lib вы не можете контролировать. Лучший способ действительно защитить его - это, вероятно, сделать копию List
в этом случае. Проблема в том, что lib является черным ящиком, и вы не можете контролировать, изменяют ли они коллекцию и, что более метко, блокируют ли они/блокируют/контролируют свои вставки/удаления из коллекции. Вероятно, создание мелкой копии Списка достаточно.См. Collections#copy(List, List) или ArrayList#ArrayList(Collection)
Вы не должны изменять коллекцию, которую вы итерируете. –
не лучше или хуже, чем обычная итерация «для каждого». – MeBigFatGuy
Это сокращенный способ выполнения 'для объекта (объект obj: objs)', который, в свою очередь, является сокращенным способом получения Итератора и итерации по коллекции. Коллекция, которая обрабатывает коллекцию, отвечает за выброшенные исключения. Итератор ArrayList действительно бросает «ConcurrentModificationException», в то время как итератор получает доступ после его изменения. Поэтому, если ваш код делает это, тогда да. В противном случае нет. – searchengine27