Java >> Tutoriel Java >  >> Tag >> synchronized

Différences entre la collecte synchronisée et la collecte simultanée en Java

Collection synchronisée vs collecte simultanée en Java

Ici, nous verrons comment Synchronized Collection diffère de Concurrent Collection en Java ?

Collecte synchronisée

  • Maintenant, nous allons voir ce qu'est la synchronisation ? Ici, synchroniser signifie qu'un seul thread est autorisé à opérer sur un objet à la fois ou, en d'autres termes, l'objet (qui est synchronisé) ne peut pas être modifié simultanément par plusieurs threads.
  • Collection synchronisée peut être modifié par un thread à la fois (c'est-à-dire qu'il n'est pas possible de modifier ou d'accéder à la collection synchronisée par plusieurs threads simultanément).
  • Collection synchronisée a des performances inférieures à celles de Concurrent Collection car à la fois un seul thread est autorisé à opérer sur un objet, ce qui augmente le temps d'attente des threads.
  • Collection synchronisée acquiert le verrou sur l'ensemble de l'objet Collection qui fournit la sécurité des threads.
  • Carte synchronisée est une classe interne statique de la classe Collections qui est disponible dans java.util.Collections.
  • Dans SynchronizedMap il acquiert le verrou sur l'ensemble de l'objet Map et encapsule toutes les méthodes de l'interface Map avec le mot-clé synchronisé.
  • Carte synchronisée peut autoriser les clés nulles et les valeurs nulles dépendent de la vraie classe Collections.

Exemple :

import java.util.*;

class SynchronizedCollectionClass {
    public static void main(String[] args) {
        try {
            Set set = new HashSet();
            
            set.add(10);
            set.add(20);
            set.add(30);
            set.add(40);
            set.add(50);
            
            System.out.println("Current Set is :" + set);
            Collection collection = Collections.synchronizedCollection(set);
            System.out.println("Synchronized Collection is :" + set);
        } catch (IndexOutOfBoundsException ex) {
            System.out.println("Exception :" + ex.getMessage());
        }
    }
}

Sortie

E:\Programs>javac SynchronizedCollectionClass.java

E:\Programs>java SynchronizedCollectionClass
Current Set is :[50, 20, 40, 10, 30]
Synchronized Collection is :[50, 20, 40, 10, 30]

Ici, nous verrons comment Concurrent Collection diffère de Synchronized Collection en Java ?

Publicité

Collection simultanée

  • Maintenant, nous allons voir ce qu'est Concurrent ? Ici, simultané signifie que seuls plusieurs threads sont autorisés à opérer sur un objet à la fois ou, en d'autres termes, l'objet (qui est concurrent) peut être modifié simultanément par plusieurs threads.
  • Collection simultanée peut être modifié par plusieurs threads à la fois (c'est-à-dire qu'il est possible de modifier ou d'accéder à Concurrent Collection par plusieurs threads simultanément).
  • Collection simultanée est plus performant que la Collecte synchronisée car à la fois plusieurs threads sont autorisés à opérer sur un objet, ce qui réduit le temps d'attente des threads.
  • Plusieurs threads peuvent effectuer des opérations de lecture-écriture simultanément, tout en assurant la sécurité des threads.
  • ConcurrentHashMap est une classe introduite dans Java 5 qui est disponible dans le package java.util.
  • ConcurrentHashMap divise l'objet Map en différentes parties et chaque thread acquiert le verrou sur chaque partie.
  • Comme nous savons que le niveau de simultanéité par défaut est 16, cela signifie que 16 threads au maximum sont autorisés à accéder simultanément à un objet par défaut et nous pouvons augmenter et diminuer le niveau de simultanéité si nous le souhaitons.
  • ConcurrentHashMap n'autorise pas les clés nulles et les valeurs nulles.

Exemple :

// We will see in a program why Concurrent concept is required

import java.util.*;

class ConcurrentClass extends Thread {
    static LinkedList ll = new LinkedList();
    public void run() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            System.out.println("ConcurrentClass" +
                " will add element");
        }

        // By using add() method to add an element in Concurrent Class Thread
        ll.add("Java");
    }

    public static void main(String[] args)
    throws InterruptedException {
        ll.add("C");
        ll.add("C++");
        ll.add("Ruby");
        ll.add("Python");

        // Creating an instance of ConcurrentClass and it will modify 
        ConcurrentClass cc = new ConcurrentClass();
        cc.start();

        // Iterating LinkedList 
        Iterator iterator = ll.iterator();
        while (iterator.hasNext()) {
            String str = (String) iterator.next();
            System.out.println(str);
            Thread.sleep(8000);
        }
        System.out.println(ll);
    }
}

Sortie

E:\Programs>javac ConcurrentClass.java

E:\Programs>java ConcurrentClass
C
Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.LinkedList$ListItr.checkForComodification
        (LinkedList.java:953)
        at java.util.LinkedList$ListItr.next(LinkedList.java:886)
        at ConcurrentClass.main(ConcurrentClass.java:34)

No
Balise Java