2010-11-19 11 views
14

Javadocs di CopyOnWriteArrayList diceComportamento di CopyOnWriteArrayList

Una variante thread-safe di ArrayList in cui tutte le operazioni mutative (aggiungere, impostare, e così via) sono implementati facendo una nuova copia della matrice sottostante .

Ora sono confuso quando altri thread vedranno cambiamenti presenti in questa nuova copia? Questo significa che ci sarà un numero di copie dell'array sottostante uguale al numero di mutazioni della collezione? In caso contrario, quando le modifiche di queste singole copie vengono trasferite all'array sottostante in modo che altri thread possano vederle?

risposta

17

L'idea è che ogni volta che si aggiunge o si rimuove allo CopyOnWriteArrayList, l'array sottostante viene sostanzialmente copiato con la modifica.

Questo significa non ci sarà certo numero di copie della matrice sottostante pari al numero di mutazioni della collezione

Sì, per ogni thread che aggiorna i ArrayList tutti gli altri thread tenendo una copia più vecchia si riferirà essenzialmente ad una diversa matrice.

quando sono le variazioni di queste singole copie vengono trasferiti matrice sottostante in modo che altri thread possono vederli?

Un array che stai guardando attualmente (diciamo che il tuo iteratore) non cambierà mai. Quando leggi da un array lo stai leggendo com'era quando hai iniziato a leggere. Se lo CopyOnWriteArrayList cambia da un altro thread, la matrice che stai attualmente osservando non verrà modificata.

per ottenere la versione più aggiornata fare una nuova lettura come list.iterator();

Detto questo, aggiornando questa collezione un sacco ucciderà prestazioni. Se hai provato a ordinare un CopyOnWriteArrayList vedrai che l'elenco lancia un UsupportedOperationException (l'ordinamento richiama impostato sulla raccolta N volte). Dovresti usare questa lettura solo quando stai facendo più di 90 +% di letture.