2013-03-15 15 views
14

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

+1

concomitante! = Parallelo. È possibile ottenere una ConcurrentModificationException con un singolo thread. –

risposta

9

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

+3

Nota a margine: ciò vale anche per i programmi a thread singolo. – svckr

+0

Hai ragione, – fredrik

+0

cosa vuoi dire è vero nei programmi a thread singolo? – Shelef

2

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.

+0

Non penso che sia sicuro aggiungerlo mentre itera su ListIterator se è coinvolto più di un thread. – assylias

+1

@assylias, ho frainteso la domanda, suppongo. Stavo solo affrontando la "ConcurrentModificationException". – mre

0

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 ...

Problemi correlati