2015-09-21 8 views

risposta

0

CopyOnWriteArrayList

un'istanza di CopyOnWriteArrayList si comporta come implementazione List che permette concorrente più letture, e per legge al verificarsi in concomitanza con una scrittura. Il modo in cui lo fa è quello di creare una nuova copia della lista ogni volta che viene modificata.

  1. Le letture non bloccano e effettivamente pagano solo il costo di una lettura volatile.
  2. Le scritture non bloccano le letture (o viceversa), ma può verificarsi una sola scrittura alla volta.
  3. A differenza di ConcurrentHashMap, le operazioni di scrittura che scrivono o accedono a più elementi nell'elenco (come addAll(), retainAll()) saranno atomiche.

Durante un'operazione di scrittura, la matrice deve essere bloccata completamente contro altre scritture. (L'implementazione standard utilizza un ReentrantLock .) Tuttavia, ciò significa che, come accennato, le operazioni che interessano più posizioni possono essere atomiche. Cioè, se un thread aggiunge diversi elementi alla lista con addAll() mentre un altro thread chiama size(), il thread che legge le dimensioni otterrà un valore che riflette o meno il numero di elementi aggiunti in addAll(): lì Non ci sarà alcuna possibilità di un valore intermedio restituito (a condizione ovviamente che questi siano gli unici due thread che accedono alla lista!).

CopyOnWriteArrayList è stato progettato per i casi in cui reads hugely outnumber writes.

CopyOnWriteArraySet

Un'altra classe, CopyOnWriteArraySet è costruire sulla parte superiore del CopyOnWriteArrayList. Come la sua controparte lista, è progettato per i casi in cui il set contiene solo pochi elementi e dove le letture superano di gran lunga il numero delle scritture.

Riferimento: Java copy-on-write collections

+0

Come funziona il meccanismo di blocco in questo caso? Ad esempio, se un thread scorre l'elenco, leggendo gli elementi nell'elenco, avrebbe acquisito il blocco sull'oggetto list e durante l'acquisizione del blocco come avrebbe potuto leggerlo da altri thread ?? Come mai le letture non stanno bloccando ?? – prvn

+0

Per la lettura non acquisisce il blocco. Il blocco viene utilizzato solo quando si verifica un aggiornamento sull'array. – YoungHobbit

+0

The [get()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.get% 28int% 29) metodo non ha alcun blocco in cui come [set()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.set%28int%2Cjava.lang.Object%29) prima acquisire il blocco quindi elaborato. – YoungHobbit

1

Il modo in cui lo fa è di fare una nuova copia della lista ogni volta che viene alterato.

Le letture non bloccano e effettivamente pagano solo il costo di una lettura volatile. Le scritture non bloccano le letture (o viceversa), ma può verificarsi una sola scrittura alla volta.

Problemi correlati