2013-03-15 4 views
14

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

+1

параллельный! = Параллельный. Вы можете получить исключение ConcurrentModificationException одним потоком. –

ответ

9

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

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

synchronized (list) { 
    // modifying list 
} 

и:

synchronized (list) { 
    // iterating over list 
} 

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

+3

Замечание: это верно даже в однопоточных программах. – svckr

+0

Вы так правы – fredrik

+0

Что это значит, что это верно в однопоточных программах? – Shelef

2

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

+0

Я не думаю, что это безопасно добавлять при повторении с ListIterator, если задействовано более одного потока. – assylias

+1

@assylias, я неправильно понял вопрос, я полагаю. Я просто обращался к «ConcurrentModificationException». – mre

0

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

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

Смежные вопросы