Обнаружение одновременных изменений? - PullRequest
8 голосов
/ 16 сентября 2008

В многопоточном приложении, над которым я работаю, мы иногда видим ConcurrentModificationExceptions в наших списках (которые в основном ArrayList, иногда Векторы). Но есть и другие случаи, когда я думаю, что происходят параллельные изменения, потому что итерация по коллекции, кажется, пропускает элементы, но не выдается никаких исключений. Я знаю, что документы для ConcurrentModificationException говорят, что вы не можете на это полагаться, но как мне быть уверенным, что я не изменяю Список одновременно? И является ли завершение каждого доступа к коллекции в синхронизированном блоке единственным способом предотвратить это?

Обновление: Да, я знаю о Collections.synchronizedCollection, но это не препятствует тому, чтобы кто-то изменил коллекцию, пока вы выполняете ее. Я думаю, что, по крайней мере, некоторые из моих проблем происходят, когда кто-то добавляет что-то в коллекцию, пока я итерирую по ней.

Второе обновление Если кто-то хочет объединить упоминание о synchronizedCollection и клонировании, как это делал Джейсон, с упоминанием java.util.concurrent и каркасов коллекций apache, таких как jacekfoo и Javamann, я могу принять ответ.

Ответы [ 12 ]

0 голосов
/ 17 сентября 2008

Это избавит вас от исключения одновременной модификации. Однако я не буду говорить об эффективности;)

List<Blah> list = fillMyList();
List<Blah> temp = new ArrayList<Blah>();
for (Blah blah : list) {
     //list.remove(blah);  would throw the exception
     temp.add(blah);
}
list.removeAll(temp);
0 голосов
/ 16 сентября 2008

Collections.synchronizedList () сделает список номинально поточно-ориентированным, а java.util.concurrent имеет более мощные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...