Sto usando Vector
invece di ArrayList
per rendere sicuro un elenco in ambiente multi-thread. Ma continuo a ricevere ConcurrentModificationException
quando provo ad aggiungere elementi allo Vector
durante l'iterazione. Perché è questo e come posso prevenirlo?Ho usato la lista sincronizzata, e ottengo ancora ConcurrentModificationException
risposta
Non è possibile modificare un vettore mentre si scorre su di esso. Memorizza gli elementi da aggiungere in un vettore separato e spostali sul vettore quando il ciclo è terminato o su una copia del vettore originale.
aggiunto: Per ottenere un mutex attorno al vettore in java, farlo in entrambe le funzioni:
synchronized (list) {
// modifying list
}
e:
synchronized (list) {
// iterating over list
}
Naturalmente ho assunto che la lista si chiama list
se si desidera aggiungere elementi mentre si itera, si vorrà utilizzare uno ListIterator
. utilizzando Vector
, non si ignora questa regola (ovviamente), quindi si consiglia di utilizzare il ArrayList
invece.
Se è necessario iterare e aggiungere contemporaneamente all'elenco, è necessario utilizzare un elenco simultaneo, ad esempio CopyOnWriteArrayList
. Nota che se scrivi molto nella lista non sarà molto efficiente.
In caso contrario, se si utilizza un vettore o una lista sincronizzata, è necessario mantenere il blocco dell'elenco durante l'iterazione. Ciò impedirà l'eccezione ma impedirà anche la concorrenza ...
- 1. Guava MultiMap e ConcurrentModificationException
- 2. ConcurrentModificationException e una HashMap
- 3. ConcurrentModificationException lanciata da sottolista
- 4. Iterazione su collezione sincronizzata
- 5. Ho ancora bisogno di utilizzare l'istruzione preparata
- 6. Ho usato Singleton con Realm Database corretto?
- 7. Se ho usato i file JavaScript compressi, ottengo errori di carattere/token illegali in Chrome e Firefox
- 8. ho un richiedo ("config.php") con gli array, ma ancora ottengo l'errore Variabile non definita
- 9. Come trovare la riga di comando di CMake che ho usato per la compilazione?
- 10. Java ConcurrentModificationException
- 11. Raccolta sincronizzata
- 12. La sezione sincronizzata non blocca!
- 13. ConcurrentModificationException per ArrayList
- 14. L'elenco genera ConcurrentModificationException ma set non lancia ConcurrentModificationException?
- 15. Volatile e sincronizzata in AsyncTask
- 16. , ma ho ancora bisogno di intestazioni?
- 17. Java keyword sincronizzata svuota la cache?
- 18. ConcurrentModificationException durante la cancellazione di un sottoelenco
- 19. Ho ancora rake/rdoctask avviso deprecato
- 20. Evitare TreeMap ConcurrentModificationException?
- 21. Rails 3.1 ssl è usato anche se ho disabilitato ssl?
- 22. Come ottenere selezionato lo stesso operatore wifi dalla lista wifi ancora e ancora in Android?
- 23. Are Parse :: Yapp, Parse :: Lex o Marpa :: R2 ancora usato?
- 24. Perché non il mio campione tiro ConcurrentModificationException
- 25. Come ottenere modifiche Mercurial quando ho già usato hg clone?
- 26. Perché la parola chiave sincronizzata in Java viene chiamata "sincronizzata" anziché quella più precisa "mutexata"?
- 27. Miscelazione sincronizzata() con ReentrantLock.lock()
- 28. comportamento diverso per la lista .__ iadd__ e la lista .__ add__
- 29. Perché ottengo un OutOfMemoryException quando ho immagini nel mio ListBox?
- 30. Vagrant autorizzazioni cartella sincronizzata
concomitante! = Parallelo. È possibile ottenere una ConcurrentModificationException con un singolo thread. –