CopyOnWriteArrayList: Perché dobbiamo fare una copia completa dei dati di origine?

3

Ho molta confusione su Java CopyOnWriteArrayist . Lo so, quando abbiamo una modifica su di esso come l'aggiornamento, l'inserimento del set, bloccherà l'intera lista, copierà una copia totale della lista delle fonti, eseguirà la modifica e quindi rilascerà il blocco. Quindi, la mia domanda è:

  1. Quando si effettua la modifica, perché non possiamo semplicemente bloccare l'array, fare la modifica e infine rilasciare il blocco? Perché dobbiamo creare una nuova copia dell'array?

  2. Il blocco scrittura è efficace solo per una modifica simultanea, ma non per una modifica e una lettura. Quando facciamo una lettura, leggiamo dal vecchio array e recuperiamo i vecchi dati, giusto?

posta wuchang 21.10.2014 - 05:29
fonte

1 risposta

4

1.When doing the modification, why cannot we just lock the array, do the modification and finally release the lock? Why we have to make a new copy of the array?

Perché se dovessi bloccare la scrittura e non creare una nuova copia dovrai anche bloccare la lettura che sarebbe un collo di bottiglia. Puoi avere questa funzionalità con Collections.synchronizedList(list) . Con CopyOnWriteArrayList non c'è nessun blocco su read, il che significa che è più veloce. A causa di questo CopyOnWriteArrayList è utile solo quando hai pochi aggiornamenti e inserti e molte letture simultanee.

2.The write lock is only effective for a concurrent modification, but not for a modification and read. When we are doing a read, we read from the old array and get the old data, right?

Sì. Se stai iterando su CopyOnWriteArrayList e mentre iterazione viene eseguita contemporaneamente una scrittura, allora Iterator non è a conoscenza delle modifiche. Dovrai avviare di nuovo l'iterazione dopo l'aggiornamento, per avere gli ultimi dati.

    
risposta data 21.10.2014 - 09:40
fonte

Leggi altre domande sui tag