В многопоточном приложении, над которым я работаю, мы иногда видим ConcurrentModificationExceptions
в наших списках (в основном это ArrayList
, иногда в векторах). Но есть и другие случаи, когда я думаю, что одновременные изменения происходят, потому что повторение через коллекцию кажется отсутствующим элементом, но никаких исключений не выбрасывается. Я знаю, что в документах для ConcurrentModificationException
говорится, что вы не можете положиться на него, но как я могу позаботиться о том, чтобы я не изменял одновременно список? И завершает ли каждый доступ к коллекции в синхронизированном блоке единственный способ предотвратить это?Обнаружение одновременных изменений?
Обновление: Да, я знаю о Collections.synchronizedCollection
, но это не защищает кого-то, изменяющего коллекцию, пока вы итерации через нее. Я думаю, что по крайней мере некоторые из моих проблем происходят, когда кто-то добавляет что-то в коллекцию, пока я повторяю ее.
Второе обновление Если кто-то хочет объединить упоминание о synchronizedCollection и клонировании, как Джейсон сделал с упоминанием java.util.concurrent и Апач рамки коллекций как jacekfoo и Javamann сделал, я могу принять ответ.
RE ОБНОВЛЕНИЕ: Сочетание использования синхронизированного сбора и дублировании содержимого списка перед тем итерация необходима. – 2008-09-16 18:08:55
Джейсон, да, я вижу это сейчас. Если бы вы добавили упоминание о CopyOnWriteArrayList в свой ответ, я бы принял его. – 2008-09-16 18:20:31
Важно ли, что при повторном запуске «живая» версия списка не изменяется или вы можете перебирать возможно устаревшую копию? Я думаю, что может возникнуть проблема с дизайном (кто контролирует доступ к списку?), А также использование синхронизации и java.util.concurrent. – 2008-09-16 19:34:13