Подтвердить что ты не робот

Я использовал синхронизированный список, и я все еще получаю ConcurrentModificationException

Я использую Vector вместо ArrayList, чтобы сделать список безопасным в многопоточном окружении. Но я продолжаю получать ConcurrentModificationException, когда я пытаюсь добавить элементы в Vector во время его итерации. Почему это и как я могу предотвратить это?

4b9b3361

Ответ 1

Вы не можете изменять вектор во время итерации по нему. Сохраните элементы, которые нужно добавить в отдельный вектор, и переместите их в вектор, когда цикл закончен, или зациклируйте копию исходного вектора.

ДОБАВЛЕНО: Чтобы получить мьютекс вокруг вектора в java, сделайте это в обеих функциях:

synchronized (list) {
  // modifying list
}

и

synchronized (list) {
  // iterating over list
}

Конечно, я предположил, что список называется list

Ответ 2

если вы хотите добавить элементы во время итерации, вы захотите использовать ListIterator. используя Vector, вы не обходите это правило (очевидно), поэтому я бы рекомендовал вместо этого использовать ArrayList.

Ответ 3

Если вам нужно повторять и добавлять одновременно ваш список, вы должны использовать параллельный список, например CopyOnWriteArrayList. Обратите внимание, что если вы много записываете в список, это будет не очень эффективно.

В противном случае, если вы используете Vector или synchronizedList, вам нужно удерживать блокировку списка во время итерации. Это предотвратит исключение, но также предотвратит concurrency...