CopyOnWriteArraySet
Questo è il fratello minore della classe
CopyOnWriteArrayList
. Si tratta di un insieme specializzato di classi aggiunte in JDK 1.5 insieme al loro cugino più popolare
ConcurrentHashMap
. Fanno parte
concurrent collection framework
e si trovano nella confezione
java.util.concurrent
.
CopyOnWriteArraySet
Ideale per raccolte di sola lettura di dimensioni sufficientemente ridotte da poter essere copiate se si verificano alcune operazioni di modifica. Ad esempio, è possibile
CopyOnWriteArraySet
archiviare un oggetto all'avvio dell'applicazione e consentire a più thread di accedere a tale oggetto durante il ciclo di vita dell'applicazione. Se in questo periodo arriva un nuovo stato o oggetto, potrà essere aggiunto anche a questo
Set
, al costo di creare un nuovo array. Una delle cose più importanti da sapere
CopyOnWriteArraySet
è che viene implementato utilizzando
CopyOnWriteArrayList
. Ciò significa che
CopyOnWriteArraySet
condivide anche tutte le proprietà di base di
CopyOnWriteArrayList
. Un'altra cosa importante da ricordare è che gli iteratori di questa classe di raccolta non supportano
remove()
. Il tentativo di rimuovere un elemento durante l'integrazione risulterà in un valore anomalo
UnsupportedOperationException
. Questo viene fatto per garantire la velocità durante la scansione. Attraversare questa implementazione
Set
utilizzando un iteratore è abbastanza veloce ed evita interferenze da altri thread. Per funzionare, gli iteratori si basano su uno snapshot dell'array acquisito al momento della creazione dell'iteratore. In breve, utilizzare
CopyOnWriteArraySet
se
set
abbastanza piccolo da poter essere copiato quando si aggiungono, impostano o eliminano oggetti e lo scopo principale è leggere dati aggiornati sporadicamente. Inoltre, se desideri rimuovere elementi durante l'iterazione, non utilizzare questa implementazione perché il suo iteratore non supporta
remove()
e lancia
java.lang.UnsupportedOperationException
, come mostrato di seguito:
[RAJ] Event received : FOUR
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)
at Publisher.notifySubs(HelloHP.java:43)
at HelloHP.main(HelloHP.java:23)
Esempio CopyOnWriteArraySet in Java
Ecco un programma Java già pronto che mostra come utilizzare
CopyOnWriteArraySet
. Nel nostro esempio, abbiamo utilizzato il modello editore
-abbonato per dimostrarne l'utilizzo. La maggior parte degli abbonati viene sottoscritta al momento del lancio dell'applicazione e il compito principale dell'editore è censirli e notificare loro eventuali aggiornamenti. Di tanto in tanto possono verificarsi aggiunte ed eliminazioni di abbonati. Poiché è necessario un bypass veloce,
CopyOnWriteArraySet
questa è una buona scelta, soprattutto in un ambiente multi-thread in cui un thread può aggiungere un sottoscrittore mentre un altro thread gestisce gli aggiornamenti.
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;
public class CopyOnWriteArraySetDemo{
public static void main(String args[]) {
Publisher cricNext = new Publisher();
SubScriber raj = new SubScriber("RAJ");
SubScriber adom = new SubScriber("ADOM");
cricNext.addSubscriber(raj);
cricNext.addSubscriber(adom);
cricNext.notifySubs("FOUR");
cricNext.notifySubs("SIX");
}
}
class Publisher {
private CopyOnWriteArraySet setOfSubs = new CopyOnWriteArraySet();
public void addSubscriber(SubScriber sub) {
setOfSubs.add(sub);
}
public void notifySubs(String score) {
Iterator itr = setOfSubs.iterator();
while (itr.hasNext()) {
SubScriber sub = itr.next();
sub.receive(score);
}
}
}
class SubScriber {
private String _name;
public SubScriber(String name) {
this._name = name;
}
public void receive(String score) {
System.out.printf("[%s] Event received : %s %n", _name, score);
}
}
Produzione:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Cosa ricordare
CopyOnWriteArraySet
implementa le interfacce
Collection
e
Set
, nonché, aggiunte in JDK 1.5, insieme a un'altra implementazione personalizzata di
Set
'a,
EnumSet
. È anche
Set
uno che utilizza l'interno
CopyOnWriteArrayList
per tutte le sue operazioni. Pertanto, condivide le stesse proprietà di base di questa classe. Poiché non lo è
SortedSet
, l'ordine degli elementi non è garantito durante l'iterazione.
-
CopyOnWriteArraySet
Ideale per applicazioni in cui:
- Le dimensioni
Set
del ' tendono a rimanere piccole.
- Le operazioni
read-only
sono significativamente superiori alle operazioni che modificano gli oggetti.
- È necessario evitare interferenze tra i thread durante l'attraversamento
Set
.
- Un altro vantaggio
CopyOnWriteArraySet
è la sicurezza del thread. Questa raccolta supporta la concorrenza.
- Le operazioni mutative (aggiunta, modifica, eliminazione e così via) sono costose perché in genere richiedono la copia dell'intero array sottostante.
- Gli iteratori non supportano l'operazione di eliminazione mutativa.
- L'attraversamento tramite iteratore è abbastanza veloce e durante esso è esclusa l'interferenza di altri thread. Per funzionare, gli iteratori si basano su uno snapshot dell'array acquisito al momento della creazione dell'iteratore.
Questo è tutto sull'utilizzo
CopyOnWriteArraySet
in Java. Come ho detto, è il fratello minore
CopyOnWriteArrayList
. Quindi se ne capisci almeno uno, puoi usare l'altro. L'unica differenza è che uno è
List
'' e l'altro
Set
è '', quindi ciò implica ereditare tutte le differenze tra queste strutture dati in Java. Ad esempio,
List
l'ordine degli elementi è importante e potrebbe contenere duplicati. Sebbene
Set
non ordinato, non consente la duplicazione di oggetti. Ricorda sempre che
CopyOnWriteArraySet
questa è una classe specializzata
Collection
. Dovrebbe essere utilizzato solo quando le condizioni sono favorevoli. In ogni altro caso, è possibile utilizzare implementazioni generiche. Ad esempio,
HashSet
o
LinkedHashSet
classi di raccolta sincronizzate. Originale:
come utilizzare CopyOnWriteArraySet in Java con l'esempio
GO TO FULL VERSION