В многопоточном приложении, над которым я работаю, мы иногда видим ConcurrentModificationExceptions
в наших списках (которые в основном ArrayList
, иногда Векторы). Но есть и другие случаи, когда я думаю, что происходят параллельные изменения, потому что итерация по коллекции, кажется, пропускает элементы, но не выдается никаких исключений. Я знаю, что документы для ConcurrentModificationException
говорят, что вы не можете на это полагаться, но как мне быть уверенным, что я не изменяю Список одновременно? И является ли завершение каждого доступа к коллекции в синхронизированном блоке единственным способом предотвратить это?
Обновление: Да, я знаю о Collections.synchronizedCollection
, но это не препятствует тому, чтобы кто-то изменил коллекцию, пока вы выполняете ее. Я думаю, что, по крайней мере, некоторые из моих проблем происходят, когда кто-то добавляет что-то в коллекцию, пока я итерирую по ней.
Второе обновление Если кто-то хочет объединить упоминание о synchronizedCollection и клонировании, как это делал Джейсон, с упоминанием java.util.concurrent и каркасов коллекций apache, таких как jacekfoo и Javamann, я могу принять ответ.