CopyOnWriteArraySet
C'est le frère cadet de la classe
CopyOnWriteArrayList
. Il s'agit d'un ensemble spécialisé de classes ajoutées dans JDK 1.5 avec leur cousin plus populaire
ConcurrentHashMap
. Ils font partie
concurrent collection framework
et se trouvent dans le package
java.util.concurrent
.
CopyOnWriteArraySet
Idéal pour les collections en lecture seule dont la taille est suffisamment petite pour être copiée si certaines opérations de modification se produisent. Par exemple, vous pouvez utiliser
CopyOnWriteArraySet
pour stocker un objet au démarrage de l'application et permettre à plusieurs autres threads d'accéder à cet objet tout au long du cycle de vie de l'application. Si un nouvel état ou objet arrive pendant ce temps, il pourra également être ajouté à celui-ci
Set
, au prix de la création d'un nouveau tableau. L’une des choses les plus importantes à savoir
CopyOnWriteArraySet
est qu’il est implémenté à l’aide de
CopyOnWriteArrayList
. Cela signifie qu'il
CopyOnWriteArraySet
partage également toutes les propriétés de base de
CopyOnWriteArrayList
. Une autre chose importante à retenir est que les itérateurs de cette classe de collection ne prennent pas en charge le
remove()
. Toute tentative de suppression d'un élément lors de l'intégration entraînera une valeur aberrante
UnsupportedOperationException
. Ceci est fait pour assurer la vitesse pendant l'exploration. Le parcours de cette implémentation
Set
à l’aide d’un itérateur est assez rapide et évite les interférences d’autres threads. Pour fonctionner, les itérateurs s'appuient sur un instantané du tableau pris lors de la création de l'itérateur. En bref, utilisez
CopyOnWriteArraySet
-le s'il est
set
suffisamment petit pour être copié lors de l'ajout, de la définition ou de la suppression d'objets, et l'objectif principal est de lire des données mises à jour sporadiquement. De plus, si vous souhaitez supprimer des éléments pendant l'itération, n'utilisez pas cette implémentation car son itérateur ne prend pas en charge
remove()
et lance
java.lang.UnsupportedOperationException
, comme indiqué ci-dessous :
[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)
Exemple CopyOnWriteArraySet en Java
Voici un programme Java prêt à l'emploi montrant comment utiliser
CopyOnWriteArraySet
. Dans notre exemple, nous avons utilisé le modèle éditeur
-abonné pour démontrer son utilisation. La plupart des abonnés sont abonnés lors du lancement de l'application et la tâche principale de l'éditeur est de les recenser et de les informer des éventuelles mises à jour. Des ajouts et des suppressions d'abonnés peuvent survenir de temps à autre. Puisque nous avons besoin d'un contournement rapide,
CopyOnWriteArraySet
c'est un bon choix, en particulier dans un environnement multithread où un thread peut ajouter un abonné tandis qu'un autre thread gère les mises à jour.
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);
}
}
Sortir:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Ce qu'il faut retenir
CopyOnWriteArraySet
implémente les interfaces
Collection
et
Set
, ainsi que, ajoutées dans JDK 1.5, avec une autre implémentation personnalisée de
Set
'a,
EnumSet
. C'est aussi
Set
celui qui utilise l'interne
CopyOnWriteArrayList
pour toutes ses opérations. Ainsi, il partage les mêmes propriétés de base que cette classe. Comme ce n'est pas le cas
SortedSet
, l'ordre des éléments n'est pas garanti lors de l'itération.
-
CopyOnWriteArraySet
Idéal pour les applications où :
- Les tailles
Set
des 's ont tendance à rester petites.
- Les opérations
read-only
sont nettement supérieures aux opérations qui modifient des objets.
- Vous devez empêcher les interférences entre les threads pendant le parcours
Set
.
- Un autre avantage
CopyOnWriteArraySet
est la sécurité des threads. Cette collection prend en charge la concurrence.
- Les opérations mutationnelles (ajout, modification, suppression, etc.) sont coûteuses car elles nécessitent généralement de copier l'intégralité du tableau sous-jacent.
- Les itérateurs ne prennent pas en charge l’opération de suppression mutative.
- La traversée à l'aide d'un itérateur est assez rapide et pendant celle-ci, l'interférence d'autres threads est exclue. Pour fonctionner, les itérateurs s'appuient sur un instantané du tableau pris lors de la création de l'itérateur.
Tout est question d'utilisation
CopyOnWriteArraySet
en Java. Comme je l'ai dit, c'est le frère cadet
CopyOnWriteArrayList
. Donc si vous comprenez au moins l’un d’eux, vous pouvez utiliser l’autre. La seule différence est que l'une est
List
'' et l'autre
Set
est '', cela implique donc d'hériter de toutes les différences entre ces structures de données en Java. Par exemple,
List
l’ordre des éléments est important et peut contenir des doublons. Bien qu'il
Set
ne soit pas ordonné, il ne permet pas la duplication d'objets. N'oubliez jamais qu'il
CopyOnWriteArraySet
s'agit d'un
Collection
cours spécialisé. Il ne doit être utilisé que lorsque les conditions sont favorables. Dans tous les autres cas, vous pouvez utiliser des implémentations à usage général. Par exemple,
HashSet
ou
LinkedHashSet
des classes de collection synchronisées. Original :
Comment utiliser CopyOnWriteArraySet en Java avec un exemple
GO TO FULL VERSION