Les méthodes vectorielles sont synchronized
. Qu'est-ce que cela signifie par programme et logiquement?
Réponses
Trop de publicités?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.
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
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.
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.
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.