JavaRush /Blog Java /Random-FR /Comment utiliser CopyOnWriteArraySet en Java avec exemple...
Lam-lam
Niveau 30

Comment utiliser CopyOnWriteArraySet en Java avec exemple (traduction)

Publié dans le groupe Random-FR
CopyOnWriteArraySetC'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 frameworket se trouvent dans le package java.util.concurrent. Comment utiliser CopyOnWriteArraySet en Java avec exemple (traduction) - 1CopyOnWriteArraySetIdé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 CopyOnWriteArraySetpour 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 CopyOnWriteArraySetest qu’il est implémenté à l’aide de CopyOnWriteArrayList. Cela signifie qu'il CopyOnWriteArraySetpartage é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 setsuffisamment 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, CopyOnWriteArraySetc'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;

/**
 * Java program to demonstrate how to use CopyOnWriteArraySet in Java. Remember,
 * CopyOnWriteArraySet doesn't support remove() operation.
 *
 * @author Javin Paul
 */
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);

            //itr.remove(); // not allowed, throws UnsupportedOperationException
        }
    }
}

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

CopyOnWriteArraySetimplémente les interfaces Collectionet Set, ainsi que, ajoutées dans JDK 1.5, avec une autre implémentation personnalisée de Set'a, EnumSet. C'est aussi Setcelui qui utilise l'interne CopyOnWriteArrayListpour 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. Comment utiliser CopyOnWriteArraySet en Java avec exemple (traduction) - 2
  1. CopyOnWriteArraySetIdéal pour les applications où :

    • Les tailles Setdes 's ont tendance à rester petites.
    • Les opérations read-onlysont nettement supérieures aux opérations qui modifient des objets.
    • Vous devez empêcher les interférences entre les threads pendant le parcours Set.
  2. Un autre avantage CopyOnWriteArraySetest la sécurité des threads. Cette collection prend en charge la concurrence.
  3. 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.
  4. Les itérateurs ne prennent pas en charge l’opération de suppression mutative.
  5. 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 CopyOnWriteArraySeten 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 Setest '', cela implique donc d'hériter de toutes les différences entre ces structures de données en Java. Par exemple, Listl’ordre des éléments est important et peut contenir des doublons. Bien qu'il Setne soit pas ordonné, il ne permet pas la duplication d'objets. N'oubliez jamais qu'il CopyOnWriteArraySets'agit d'un Collectioncours 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, HashSetou LinkedHashSetdes classes de collection synchronisées. Original : Comment utiliser CopyOnWriteArraySet en Java avec un exemple
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION