Я использовал синхронизированный список, и я все еще получаю ConcurrentModificationException
Я использую Vector
вместо ArrayList
, чтобы сделать список безопасным в многопоточном окружении. Но я продолжаю получать ConcurrentModificationException
, когда я пытаюсь добавить элементы в Vector
во время его итерации. Почему это и как я могу предотвратить это?
Ответы
Ответ 1
Вы не можете изменять вектор во время итерации по нему. Сохраните элементы, которые нужно добавить в отдельный вектор, и переместите их в вектор, когда цикл закончен, или зациклируйте копию исходного вектора.
ДОБАВЛЕНО:
Чтобы получить мьютекс вокруг вектора в java, сделайте это в обеих функциях:
synchronized (list) {
// modifying list
}
и
synchronized (list) {
// iterating over list
}
Конечно, я предположил, что список называется list
Ответ 2
если вы хотите добавить элементы во время итерации, вы захотите использовать ListIterator
. используя Vector
, вы не обходите это правило (очевидно), поэтому я бы рекомендовал вместо этого использовать ArrayList
.
Ответ 3
Если вам нужно повторять и добавлять одновременно ваш список, вы должны использовать параллельный список, например CopyOnWriteArrayList
. Обратите внимание, что если вы много записываете в список, это будет не очень эффективно.
В противном случае, если вы используете Vector или synchronizedList, вам нужно удерживать блокировку списка во время итерации. Это предотвратит исключение, но также предотвратит concurrency...