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 ...
concomitante! = Parallelo. È possibile ottenere una ConcurrentModificationException con un singolo thread. –