Come indicato su questo link:
CopyOnWriteArrayList è una classe Collection concomitante introdotto in Java 5 Concorrenza API insieme a suo cugino popolare ConcurrentHashMap in Java.
CopyOnWriteArrayList implementa l'interfaccia Elenco come ArrayList, Vector e LinkedList ma è una raccolta thread-safe e raggiunge la sicurezza del thread in un modo leggermente diverso rispetto a Vector o ad altre classi di raccolta thread-safe.
Come nome suggerisce CopyOnWriteArrayList crea copia del sottostante ArrayList ad ogni operazione di mutazione per esempio aggiungi o imposta. Normalmente CopyOnWriteArrayList è molto costoso perché comporta una copia costosa di di array con ogni operazione di scrittura ma è molto efficiente se si dispone di un elenco in cui Iterazione supera la mutazione ad es. per lo più è necessario iterare ArrayList e non modificarlo troppo spesso.
Iterator di CopyOnWriteArrayList è fail-safe e non genera ConcurrentModificationException anche se alla base CopyOnWriteArrayList viene modificata una volta iterazione inizia perché Iterator sta operando sulla copia separata di ArrayList. Di conseguenza, tutti gli aggiornamenti effettuati su CopyOnWriteArrayList non sono disponibili su Iterator .
per ottenere la versione più aggiornata fare una nuova lettura come list.iterator();
Detto questo, aggiornando questa collezione un sacco ucciderà prestazioni. Se si è tentato di ordinare un oggetto CopyOnWriteArrayList, verrà visualizzato un oggetto UsupportedOperationException (il richiamo dell'ordinamento impostato sulla raccolta N volte). Dovresti usare questa lettura solo quando stai facendo più di 90 +% di letture.
fonte
2013-07-25 08:48:25
E se è necessario aggiungere elementi molto frequentemente all'elenco e talvolta è necessario rimuovere tutto. Pensi che la via "sincronizzata" sia l'approccio migliore? –
È possibile considerare il pacchetto 'java.util.concurrent' su' Collections.synchronizedList'. –
Lo sto già usando. Ma sembra funzionare solo quando combino con la vecchia parola chiave 'sincronizzata'. –