1152 votes

Que signifie "synchronisé"?

Les méthodes vectorielles sont synchronized . Qu'est-ce que cela signifie par programme et logiquement?

991voto

Stu Thompson Points 16599

Le mot-clé synchronized est tout au sujet de différents threads de lecture et d'écriture pour les mêmes variables, les objets et les ressources. Ce n'est pas une mince sujet en Java, mais voici une citation de Sun:

Synchronisé méthodes permettent d'un simple stratégie de prévention de fil et l'interférence de la consistance de la mémoire erreurs: si un objet est visible à plus d'un thread, toutes les lectures ou écrit à cet objet, les variables sont fait par le biais de méthodes synchronisées.

Dans un très, très petit résumé: Lorsque vous avez deux fils qui sont la lecture et l'écriture à même de "ressource", de dire une variable nommée foo, vous devez vous assurer que ces threads accèdent à la variable dans une atomique. Sans l' synchronized mot-clé, votre fil 1 ne peut pas voir le changement de thread 2 fait à foo, ou pire, il ne peut être que la moitié de changé. Ce ne serait pas ce que vous logiquement s'attendre.

Encore une fois, c'est un non-trivial sujet en Java. Pour en savoir plus, d'explorer des sujets ici sur soi et sur les Interwebs:

Continuer d'explorer ces sujets jusqu'à ce que le nom de "Brian Goetz" devient définitivement associée avec le terme de "simultanéité" dans votre cerveau.

342voto

Dheeraj Sachan Points 21

Considérez ce code

 public class SOP {
    public static void print(String s)
    {
        System.out.println(s+"\n");
    }
}

public class TestThread extends Thread
{
    String name;
    Synchronised synchronised;
    public TestThread(String name,Synchronised synchronised)
    {
        this.synchronised = synchronised;
        this.name = name;
        start();
    }

    @Override
    public void run()
    {
        synchronised.test(name);
    }
}

public class Synchronised {
    public synchronized void test(String name)
    {
        for(int i=0;i<10;i++)
        {
            SOP.print(name + " :: "+i);
            try{
                Thread.sleep(500);
            }
            catch (Exception e)
            {
                SOP.print(e.getMessage());
            }
        }
    }

    public static void main(String[] args)
    {
        Synchronised synchronised = new Synchronised();
        new TestThread("THREAD 1",synchronised);
        new TestThread("THREAD 2",synchronised);
        new TestThread("THREAD 3",synchronised);
    }
}
 

Remarque: synchronized bloque l'appel du thread suivant à la méthode test () tant que l'exécution du thread précédent n'est pas terminée. Les threads peuvent accéder à cette méthode un à la fois. Sans synchronized tous les threads peuvent accéder à cette méthode simultanément.

Sortie avec synchronisé

 THREAD 1 :: 0
THREAD 1 :: 1
THREAD 1 :: 2
THREAD 1 :: 3
THREAD 1 :: 4
THREAD 1 :: 5
THREAD 1 :: 6
THREAD 1 :: 7
THREAD 1 :: 8
THREAD 1 :: 9
THREAD 3 :: 0
THREAD 3 :: 1
THREAD 3 :: 2
THREAD 3 :: 3
THREAD 3 :: 4
THREAD 3 :: 5
THREAD 3 :: 6
THREAD 3 :: 7
THREAD 3 :: 8
THREAD 3 :: 9
THREAD 2 :: 0
THREAD 2 :: 1
THREAD 2 :: 2
THREAD 2 :: 3
THREAD 2 :: 4
THREAD 2 :: 5
THREAD 2 :: 6
THREAD 2 :: 7
THREAD 2 :: 8
THREAD 2 :: 9
 

Sortie sans synchronisation

 THREAD 1 :: 0
THREAD 2 :: 0
THREAD 3 :: 0
THREAD 1 :: 1
THREAD 2 :: 1
THREAD 3 :: 1
THREAD 1 :: 2
THREAD 2 :: 2
THREAD 3 :: 2
THREAD 1 :: 3
THREAD 2 :: 3
THREAD 3 :: 3
THREAD 1 :: 4
THREAD 2 :: 4
THREAD 3 :: 4
THREAD 1 :: 5
THREAD 2 :: 5
THREAD 3 :: 5
THREAD 1 :: 6
THREAD 2 :: 6
THREAD 3 :: 6
THREAD 1 :: 7
THREAD 2 :: 7
THREAD 3 :: 7
THREAD 1 :: 8
THREAD 2 :: 8
THREAD 3 :: 8
THREAD 1 :: 9
THREAD 2 :: 9
THREAD 3 :: 9
 

123voto

jmort253 Points 16929

Les mots clés "synchronisés" empêchent l'accès simultané à un bloc de code ou d'objet par plusieurs threads. Par défaut, un Hashtable est synchronisé, ainsi un seul thread peut accéder à la table à la fois. Pour un HashMap, si vous voulez éviter les problèmes de sécurité des threads, vous devez en tenir compte manuellement dans votre code.

88voto

Codemwnci Points 28817

Synchronisé signifie que dans un environnement à plusieurs threads, un objet synchronisé ne laisse pas deux threads accéder en même temps. Cela signifie qu'un thread ne peut pas être lu tandis qu'un autre le met à jour.

Le deuxième thread attendra plutôt jusqu'à ce que le premier soit terminé. La surcharge est la vitesse, mais l'avantage est la cohérence des données.

Si votre application est un thread unique, la synchronisation n'a aucun avantage.

57voto

Thilo Points 108673

L' synchronized mot-clé provoque un thread pour obtenir un verrou lors de la saisie de la méthode, de sorte qu'un seul thread peut exécuter la méthode en même temps (pour l'objet de l'instance, sauf si c'est une méthode statique).

Ceci est souvent appelé à faire de la classe thread-safe, mais je dirais que c'est un euphémisme. S'il est vrai que la synchronisation protège de l'état interne du Vecteur d'obtenir endommagé, il n'est généralement pas aider à l'utilisateur de Vecteur de beaucoup.

Réfléchissez à ceci:

 if (vector.isEmpty()){
     vector.add(data);
 }

Même si les méthodes sont synchronisés, parce qu'ils sont en train d'être verrouillé et déverrouillé individuellement, à deux, malheureusement, chronométré threads peuvent créer un vecteur à deux composantes.

Donc en effet, vous avez à synchroniser dans le code de votre application.

Parce que la méthode de synchronisation de niveau est une) cher quand vous n'en avez pas besoin, et b) l'insuffisance des lorsque vous avez besoin de synchronisation, il y a maintenant, non synchronisé des remplacements (ArrayList dans le cas du Vecteur).

Plus récemment, la simultanéité paquet a été libéré, avec un certain nombre de clever utilitaires de prendre soin de multi-threading questions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X