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.
fonte
2010-11-19 17:54:26