Frage

Ich habe einige Fragen zur Verwendung und Bedeutung des synchronized Stichwort.

  • Welche Bedeutung hat das synchronized Stichwort?
  • Wann sollten Methoden sein synchronized?
  • Was bedeutet es programmatisch und logisch?
War es hilfreich?

Lösung

Das synchronized Schlüsselwort dreht sich alles um verschiedene Themen zu lesen und auf die gleichen Variablen, Objekte und Ressourcen zu schreiben. Dies ist kein triviales Thema in Java, aber hier ist ein Zitat von Sun:

  

synchronized Methoden ermöglichen eine einfache   Strategie zur Verhinderung Gewinde   Störungen und Speicherkonsistenz   Fehler: Wenn ein Objekt sichtbar   mehr als ein Thread, alle Lese- oder   schreibt, dass Variablen des Objekts sind   erfolgt durch synchronisierte Methoden.

In einem sehr, sehr kleinen Punkt: Wenn Sie zwei Threads, die auf die gleiche ‚Ressource‘ lesen und schreiben, sagen, eine Variable mit dem Namen foo, müssen Sie sicherstellen, dass diese Fäden Zugriff der Variable in einem Atom Weise. Ohne das synchronized Schlüsselwort, Thread 1 kann die Änderung Gewinde 2 gemacht foo nicht sehen, oder noch schlimmer, kann es nur die Hälfte geändert werden. Dies wäre nicht das, was Sie logisch erwarten.

Auch dies ist ein nicht-triviales Thema in Java. Um mehr zu erfahren, Themen erforschen hier auf SO und die Interwebs über:

Beachten Sie die folgenden Themen, bis der Name erforschen "Brian Goetz" wird mit dem Begriff "Parallelität" in Ihr Gehirn dauerhaft verbunden.

Andere Tipps

Nun, ich denke, dass wir genug von theoretischen Erklärungen hatten, so betrachten Sie diesen Code

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

public class TestThread extends Thread {
    String name;
    TheDemo theDemo;
    public TestThread(String name,TheDemo theDemo) {
        this.theDemo = theDemo;
        this.name = name;
        start();
    }
    @Override
    public void run() {
        theDemo.test(name);
    }
}

public class TheDemo {
    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) {
        TheDemo theDemo = new TheDemo();
        new TestThread("THREAD 1",theDemo);
        new TestThread("THREAD 2",theDemo);
        new TestThread("THREAD 3",theDemo);
    }
}

Hinweis: synchronized blockiert den Aufruf des nächsten Thread zu Verfahren Test (), solange die Ausführung des vorherigen Thread nicht beendet ist. Themen können diese Methode einer nach dem anderen zugreifen. Ohne synchronized alle Threads gleichzeitig diese Methode zugreifen können.

Wenn ein Thread die synchronisierte Methode ‚Test‘ des Objekts bezeichnet (hier Objekt ist eine Instanz von ‚TheDemo‘ Klasse) erwirbt sie das Schloss des Objekts, jeder neuen Thread kann keine synchronisierte Methode des gleichen Objekts aufrufen, wie lange wie frühere Threads, die Sperre erworben hatte nicht die Sperre wieder freigeben.

Ähnliches passiert, wenn eine statische Synchron Methode der Klasse aufgerufen wird. Der Faden erhält die Sperre mit der Klasse verbunden ist (in diesem Fall jedes nicht statisch synchronisierte Methode einer Instanz dieser Klasse kann von jedem Thread aufgerufen werden, da die Objektebene Sperre noch verfügbar ist). All anderer Thread nicht in der Lage sein, so lange statische synchronisierte Methode der Klasse zu nennen, wie die Klassenstufe Sperre wird nicht durch das Gewinde freigegeben, die zur Zeit hält die Sperre.

Ausgabe mit synchronisiertem

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

Ausgabe ohne synchronisiert

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

Das synchronized Schlüsselwort verhindert den gleichzeitigen Zugriff auf einen Block von Code oder ein Objekt von mehreren Threads. Standardmäßig ist ein Hashtable synchronized, so dass nur ein Thread in der Tabelle zu einem Zeitpunkt zugreifen kann.

Auf Verwendung von non-synchronized wie HashMap konstruiert, müssen Sie Thread-Sicherheit Funktionen in Ihrem Code erstellen Speicherkonsistenzfehler zu vermeiden.

synchronized bedeutet, dass in einer Multi-Threaded-Umgebung, ein Objekt mit synchronized Verfahren (e) / Block (n), die nicht zwei Threads nicht lassen die synchronized Verfahren (e) / Block (n) des Code zur gleichen Zeit zuzugreifen. Das bedeutet, dass ein Thread nicht lesen kann, während ein anderer Thread es aktualisiert.

Der zweite Thread wird stattdessen warten, bis der erste Thread seine Ausführung abgeschlossen ist. Der Overhead ist die Geschwindigkeit, aber der Vorteil ist, garantiert die Konsistenz der Daten.

Wenn Ihre Anwendung Single-Threaded ist jedoch, synchronized Blöcke Vorteile bieten keine.

Das synchronized Schlüsselwort verursacht einen Thread eine Sperre zu erhalten, wenn das Verfahren eintritt, so dass nur ein Thread das Verfahren zur selben Zeit (für die gegebene Objektinstanz, wenn es eine statische Methode ist) ausführen kann.

Diese häufig genannt die Klasse Thread-sicher zu machen, aber ich würde sagen, das ist ein Euphemismus ist. Es stimmt zwar, dass die Synchronisation des internen Zustands des Vektors vom Erhalten beschädigt schützt, ist dies in der Regel nicht viel von dem Benutzer Vector helfen.

Bedenken Sie:

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

Auch wenn die beteiligten Methoden synchronisiert sind, weil sie gesperrt werden und entriegelt einzeln, zwei leider zeitlich Threads können einen Vektor mit zwei Elementen erstellen.

Also in der Tat, haben Sie auch in Ihrem Anwendungscode zu synchronisieren.

Weil Methode Ebene Synchronisation ist a) teuer, wenn Sie es nicht brauchen, und b) nicht ausreichend, wenn Sie die Synchronisierung benötigen, gibt es nun unsynchronisierte Ersatz (Arraylist im Fall von Vector).

In jüngerer Zeit hat sich die Gleichzeitigkeit Paket freigegeben wurde, mit einer Reihe von cleveren Dienstprogramme, die darauf achten, von Multi-Thread-Probleme.

Übersicht

Synchronized Schlüsselwort in Java hat mit Thread-Sicherheit zu tun, das heißt, wenn mehrere Threads gelesen oder die gleiche Variable schreiben.
Dies kann direkt geschehen (durch die gleiche Variable Zugriff) oder indirekt (durch eine Klasse verwenden, die eine andere Klasse verwendet, die die gleiche Variable zugreift).

Das synchronisierte Schlüsselwort wird verwendet, um einen Codeblock zu definieren, wo mehrere Threads die gleiche Variable in einer sicheren Art und Weise zugreifen können.

Deeper

Syntax weise die synchronized Schlüsselwort nimmt eine Object wie es Parameter (die so genannte ein Sperrobjekt ), die dann von einem { block of code } folgt.

  • Wenn die Ausführung dieses Schlüsselwort trifft, versucht der aktuelle Thread auf „lock / acquire / eigene“ (nehmen Sie Ihre Wahl) die Sperrobjekt und den zugehörigen Codeblock ausgeführt werden, nachdem die Sperre hat erworben.

  • Jede Schreibvorgänge auf Variablen innerhalb des synchronisierten Codeblock sind garantiert zu jedem anderen Faden sichtbar sein, die ähnlich Code innerhalb eines synchronisierten Codeblock mit dem gleichen Sperrobjekt führt .

  • Nur ein Thread zu einer Zeit, kann die Sperre halten, während dieser Zeit alle andere Threads versuchen, das gleiche Sperrobjekt zu erwerben werden (Pause ihre Ausführung) warten. Die Sperre wird freigegeben, wenn die Ausführung des synchronisierten Codeblock beendet wird.

Synchronisierte Methoden:

Hinzufügen synchronized Schlüsselwort zu einer Methodendefinition ist gleich dem gesamten Verfahren Körper in einem synchronisierten Codeblock mit der Sperrobjekt Das this (zB Methoden) gewickelt wird und ClassInQuestion.getClass() (für Klassenmethoden) .

- Instance-Verfahren ist ein Verfahren, das nicht static Schlüsselwort hat
. - Klasse ist ein Verfahren, das static Keyword

.

Technische

Ohne Synchronisation ist es nicht, in dem garantiert bestellt die Lese- und Schreibvorgänge geschehen, möglicherweise die Variable mit Müll zu hinterlassen.
(zum Beispiel einer Variable mit der Hälfte der Bits von einem Thread und die Hälfte des Bits geschrieben von einem anderen Thread geschrieben, so dass der Variable in einem Zustand, dass weder die Fäden versucht zu schreiben, aber ein kombinierte Chaos könnte am Ende von beides.)

Es ist nicht genug, um einen Schreibvorgang in einem Thread vor (Wandtaktzeit) in Anspruch nehmen ein anderer Thread liest, weil Hardware, um den Wert der Variablen im Cache gespeichert haben könnte, und der Lese Thread würde den zwischengespeicherten Wert statt sehen, was geschrieben wurde, um es.

Fazit

So in Java Fall, müssen Sie das Java-Speichermodell folgen, dass threading Fehler, um sicherzustellen, nicht passieren.
Mit anderen Worten:. Verwenden Sie die Synchronisation, atomare Operationen oder Klassen, die sie für Sie unter den Hauben verwenden

  

Quellen

     

http://docs.oracle.com/javase/specs/jls/se8 /html/index.html
   Java® Language Specification, 2015.02.13

Betrachten Sie es als eine Art Drehkreuz wie Sie bei einem Fußballplatz finden könnten. Es gibt parallel dampft von Menschen wollen in bekommen, aber am Drehkreuz sie ‚synchronisiert‘ werden. Nur eine Person zu einem Zeitpunkt kann durch. Alle diejenigen tun, um durchzukommen, aber sie können, bis sie durchlaufen können warten müssen.

  

Was ist das Schlüsselwort synchronized?

Themen kommunizieren in erster Linie durch den Zugang zu Bereichen zu teilen und die Objekte Referenzfelder beziehen. Diese Form der Kommunikation ist äußerst effizient, macht aber zwei Arten von Fehlern möglich: Gewindeinterferenz und Speicherkonsistenzfehler . Das Tool benötigt, um diese Fehler zu verhindern, ist die Synchronisation.

Synchronisierte Blöcke oder Methoden verhindert Gewindeinterferenz und stellen Sie sicher, dass die Daten konsistent sind. Zu jedem Zeitpunkt kann nur ein Thread Zugriff auf einen synchronisierten Block oder Methode ( kritische Abschnitt ) durch eine Sperre zu erwerben. Andere Gewinde (n) für die Freigabe der Sperre für den Zugriff warten kritische Abschnitt .

  

Wann Methoden synchronisiert?

Methoden werden synchronisiert, wenn Sie synchronized zu Methodendefinition oder Erklärung hinzuzufügen. Sie können auch einen bestimmten Codeblock mit in einem Verfahren synchronisieren.

  

Was bedeutet es, pro grammatisch und logisch?

Es bedeutet, dass nur ein Thread Zugriff auf kritischen Abschnitt durch eine Sperre zu erwerben. Es sei denn, diese Thread Freigabe dieser Sperre, all anderer Thread (s) wird warten müssen, eine Sperre zu erwerben. Sie haben keinen Zugang zu betreten kritische Abschnitt mit dem Erwerb der Sperre.

Das kann nicht mit einem Zauber erfolgen. Es ist Programmierer Verantwortung zu identifizieren kritische Abschnitt (e) in der Anwendung und schützen Sie es entsprechend. Java bietet einen Rahmen, Ihre Anwendung zu schützen, aber wo und was alle Abschnitte bewacht werden soll in der Verantwortung des Programmierers.

Weitere Details von Java-Dokumentation

Intrinsic Schlösser und Synchronisation:

  

Die Synchronisation wird um eine interne Einheit, bekannt als die intrinsische Sperre oder Monitor Schloss gebaut. Intrinsic Schlösser eine Rolle in beiden Aspekten der Synchronisation spielen. Erzwingen exklusiven Zugriff auf den Zustand eines Objekts und zur Erstellung geschieht-vor Beziehungen, die Sichtbarkeit wesentlich sind

Jedes Objekt hat eine innere Sperre damit verbundene . Vereinbarungsgemäß wird ein Thread, der auf ein Objektfeld exklusiven und konsistenten Zugriff benötigt hat, um das innere Sperre des Objekts zu erwerben, bevor sie Zugriff auf und lassen Sie dann die innere Sperre, wenn er mit ihnen fertig ist.

Ein Thread gesagt wird die innere Sperre zwischen der Zeit, besitzen sie die Verriegelung freigegeben und die Verriegelung erlangt haben. Solange ein Thread eine intrinsische Sperre besitzt, kann kein anderer Thread die gleiche Sperre erwerben. Der andere Thread wird blockiert, wenn es versucht, die Sperre zu erhalten.

  

Wenn ein Thread eine intrinsische Sperre freigibt, eine geschieht vor-Beziehung zwischen dieser Aktion und jeder nachfolgenden Erfassung der gleichen Sperre aufgebaut wird.

Herstellungsverfahren synchronisiert hat zwei Effekte :

  

Als erstes ist es nicht möglich, dass zwei Anrufungen von synchronisierten Methoden auf demselben Objekt verschachteln.

Wenn ein Thread eine synchronisierte Methode für ein Objekt ausgeführt wird, werden alle anderen Threads, die Methoden für die gleiche Objektblock (Suspend Ausführung), bis der erste Thread synchronisiert invoke wird mit dem Objekt durchgeführt.

  

Zweitens, wenn ein synchronisiertes Verfahren beendet wird, es automatisch eine geschieht vor-Beziehung mit jedem nachfolgenden Aufruf eines synchronisierten Verfahrens für dasselbe Objekt.

Damit ist gewährleistet, dass Änderungen an den Zustand des Objekts an alle Threads sichtbar sind.

Geben Sie für andere Alternativen zur Synchronisation in:

synchronisiert vermeiden (dies) in Java?

Hier ist eine Erklärung von Die Java-Tutorials .

Betrachten Sie den folgenden Code ein:

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}
     

Wenn count eine Instanz von SynchronizedCounter ist, dann diese Methoden synchronisiert machen hat zwei Effekte:

     
      
  • Erstens ist es für zwei Anrufungen von synchronisierten Methoden auf dem gleichen Objekt nicht möglich verschachteln. Wenn ein Thread eine synchronisierte Methode für ein Objekt ausgeführt wird, werden alle anderen Threads, die Methoden für die gleiche Objektblock (Suspend Ausführung) synchronisiert invoke, bis der erste Thread mit dem Objekt durchgeführt.
  •   
  • Zweitens, wenn ein synchronisiertes Verfahren beendet wird, es automatisch eine geschieht vor-Beziehung mit jedem nachfolgenden Aufruf eines synchronisierten Verfahrens für dasselbe Objekt. Damit ist gewährleistet, dass Änderungen an dem Zustand des Objekts an alle Threads sichtbar sind.
  •   

Synchronized normal method entspricht Synchronized statement (verwenden Sie diese)

class A {
    public synchronized void methodA() {
        // all function code
    }

    equivalent to

    public void methodA() {
        synchronized(this) {
             // all function code
        }
    } 
}

Synchronized static method entspricht Synchronized statement (Nutzungsklasse)

class A {
    public static synchronized void methodA() {
        // all function code
    }

    equivalent to

    public void methodA() {
        synchronized(A.class) {
             // all function code
        }
    } 
}

Synchronized-Anweisung (mit Variable)

class A {
    private Object lock1 = new Object();

    public void methodA() {
        synchronized(lock1 ) {
             // all function code
        }
    } 
}

Für synchronized, haben wir beide Synchronized Methods und Synchronized Statements. Allerdings Synchronized Methods ähnlich ist Synchronized Statements so einfach Synchronized Statements müssen wir verstehen.

=> Im Grunde haben wir

synchronized(object or class) { // object/class use to provides the intrinsic lock
   // code 
}

Hier ist 2 denken, dass Hilfe Verständnis synchronized

  • Jedes Objekt / Klasse haben ein intrinsic lock mit ihr verbunden sind.
  • Wenn ein Thread eine synchronized statement aufruft, erhält er automatisch die intrinsic lock für das synchronized statement's Objekt und gibt es, wenn die Methode zurückgibt. Solange ein Thread ein intrinsic lock besitzt, NO andere Thread kann die SAME lock => Thread-sicher erwerben.

=> Wenn ein thread A synchronized(this){// code 1} ruft => alle Blockcode (innen-Klasse), wo synchronized(this) und alle synchronized normal method (innen Klasse) haben wird, weil SAME Schloss verriegelt. Es wird nach thread A unlock ( "// Code 1" abgeschlossen) auszuführen.

Dieses Verhalten ist ähnlich wie synchronized(a variable){// code 1} oder synchronized(class).

SAME LOCK => Sperre (nicht auf das Verfahren ab? Oder die Aussagen?)

Mit synchronisierte Methode oder synchronisiert Aussagen?

Ich ziehe synchronized statements, weil es mehr erweiterbar ist. Beispiel in Zukunft brauchen Sie nur einen Teil des Verfahrens synchronisiert. Beispiel: Sie haben 2 synchronisierte Methode und es haben keine relevant zueinander sind, aber wenn ein Thread ein Verfahren ausführen, wird es die andere Methode blockieren (durch Verwendung synchronized(a variable) verhindern können).

Allerdings gelten synchronisierte Methode ist einfach und der Code einfach aussehen. Für einige Klasse gibt es nur 1 synchronisierte Methode, oder alle synchronisierten Methoden in der Klasse in relevanten zueinander => wir können synchronized method verwenden, um Code kürzer und leicht zu verstehen

zu machen

Hinweis

(es ist nicht relevant zu viel synchronized ist es der Unterschied zwischen Objekt und Klasse oder keinem statisch und statisch).

  • Wenn Sie synchronized oder normale Methode oder synchronized(this) oder synchronized(non-static variable) wird es Basis auf jeder Objektinstanz synchronisiert.
  • Wenn Sie synchronized oder statische Methode oder synchronized(class) oder synchronized(static variable) es Basis auf Klasse synchronisiert

Referenz

https://docs.oracle.com/javase/tutorial/ wesentliche / Gleichzeitigkeit / syncmeth.html https://docs.oracle.com/javase/tutorial/essential/concurrency /locksync.html

Hoffe, dass es helfen

Zu meinem Verständnis synchronisiert bedeutet im Grunde, dass der Compiler ein Monitor.Enter und Monitor.Exit um Ihre Methode schreiben. Als solches kann es Thread-sicher je nach sein, wie es verwendet wird (was ich meine ist, dass Sie ein Objekt mit synchronisierten Methoden schreiben, die nicht abhängig ist thread auf, was Ihre Klasse der Fall ist).

Was den anderen Antworten fehlt, ist ein wichtiger Aspekt: Gedächtnisbarrieren.Die Thread-Synchronisation besteht im Wesentlichen aus zwei Teile:Serialisierung und Sichtbarkeit.Ich empfehle jedem, nach „JVM-Speicherbarriere“ zu googeln, da es sich um ein nicht triviales und äußerst wichtiges Thema handelt (wenn Sie gemeinsam genutzte Daten ändern, auf die mehrere Threads zugreifen).Nachdem ich das getan habe, empfehle ich, einen Blick auf die Klassen des Pakets java.util.concurrent zu werfen, die helfen, die Verwendung einer expliziten Synchronisierung zu vermeiden, was wiederum dazu beiträgt, Programme einfach und effizient zu halten und möglicherweise sogar Deadlocks zu verhindern.

Ein solches Beispiel ist ConcurrentLinkedDeque.Zusammen mit dem Befehlsmuster Es ermöglicht die Erstellung hocheffizienter Arbeitsthreads, indem die Befehle in die gleichzeitige Warteschlange gestopft werden – keine explizite Synchronisierung erforderlich, keine Deadlocks möglich, kein explizites Sleep() erforderlich, einfach die Warteschlange durch Aufruf von take() abfragen.

Zusamenfassend:Es findet eine „Speichersynchronisation“ statt implizit Wenn Sie einen Thread starten, endet ein Thread, Sie lesen eine flüchtige Variable, Sie entsperren einen Monitor (verlassen einen synchronisierten Block/eine synchronisierte Funktion) usw.Diese „Synchronisation“ wirkt sich aus (sozusagen „spült“) alle schreibt vor dieser bestimmten Aktion.Im oben genannten Fall ConcurrentLinkedDeque, In der Dokumentation heißt es:

Auswirkungen auf die Speicherkonsistenz:Wie bei anderen gleichzeitigen Sammlungen Aktionen in einem Thread vor dem Platzieren eines Objekts in einem ConcurrentLinkedDeque passieren-vorher Aktionen im Anschluss an den Zugriff oder das Entfernen dieses Elements aus dem ConcurrentLinkedDeque in einem anderen Faden.

Dieses implizite Verhalten ist ein etwas schädlicher Aspekt, da die meisten Java-Programmierer ohne große Erfahrung dadurch vieles als gegeben ansehen.Und dann stolpere ich plötzlich über diesen Thread, nachdem Java in der Produktion, wo es eine andere Arbeitslast gibt, nicht das tut, was es „tun“ soll – und es ziemlich schwierig ist, Parallelitätsprobleme zu testen.

Synchronisierte einfach bedeutet, dass mehrere Threads, wenn sie mit einzelnen Objekt zugeordnet dirty read verhindern und schreiben kann, wenn synchronisierten Block auf bestimmten Objekt verwendet wird. Um Ihnen mehr Klarheit zu geben, läßt ein Beispiel:

class MyRunnable implements Runnable {
    int var = 10;
    @Override
    public void run() {
        call();
    }

    public void call() {
        synchronized (this) {
            for (int i = 0; i < 4; i++) {
                var++;
                System.out.println("Current Thread " + Thread.currentThread().getName() + " var value "+var);
            }
        }
    }
}

public class MutlipleThreadsRunnable {
    public static void main(String[] args) {
        MyRunnable runnable1 = new MyRunnable();
        MyRunnable runnable2 = new MyRunnable();
        Thread t1 = new Thread(runnable1);
        t1.setName("Thread -1");
        Thread t2 = new Thread(runnable2);
        t2.setName("Thread -2");
        Thread t3 = new Thread(runnable1);
        t3.setName("Thread -3");
        t1.start();
        t2.start();
        t3.start();
    }
}

Wir zwei Objekte MyRunnable Klasse erstellt haben, geteilt runnable1 wird nur mit Gewinde 1 und Faden 3 & runnable2 wobei 2 mit Gewinden geteilt. Nun, wenn t1 und t3 beginnen, ohne synchronisiert verwendet wird, PFB Ausgang, lassen vermuten, dass beiden Threads 1 und 3 gleichzeitig var Wert beeinflussen, wo für Gewinde 2, var seinen eigenen Speicher hat.

Without Synchronized keyword

    Current Thread Thread -1 var value 11
    Current Thread Thread -2 var value 11
    Current Thread Thread -2 var value 12
    Current Thread Thread -2 var value 13
    Current Thread Thread -2 var value 14
    Current Thread Thread -1 var value 12
    Current Thread Thread -3 var value 13
    Current Thread Thread -3 var value 15
    Current Thread Thread -1 var value 14
    Current Thread Thread -1 var value 17
    Current Thread Thread -3 var value 16
    Current Thread Thread -3 var value 18

Synchronzied verwenden, Gewinde 3 wartet Faden 1 in allen Szenarien abzuschließen. Es gibt zwei Schlösser erworben, ein auf runnable1 by thread geteilt 1 und Faden 3 und ein anderes auf runnable2 by thread geteilt 2 nur.

Current Thread Thread -1 var value 11
Current Thread Thread -2 var value 11
Current Thread Thread -1 var value 12
Current Thread Thread -2 var value 12
Current Thread Thread -1 var value 13
Current Thread Thread -2 var value 13
Current Thread Thread -1 var value 14
Current Thread Thread -2 var value 14
Current Thread Thread -3 var value 15
Current Thread Thread -3 var value 16
Current Thread Thread -3 var value 17
Current Thread Thread -3 var value 18

synchronisiert einfachen Mitteln keine zwei Threads können die Block / Methode gleichzeitig zuzugreifen. Wenn wir irgendein Block / Methode einer Klasse sagen synchronisiert ist es bedeutet, nur ein Thread sie zu einem Zeitpunkt zugreifen kann. Intern arbeitet der Faden, der es zuerst nimmt eine Sperre auf diesem Objekt und solange diese Sperre nicht verfügbar ist, kein anderer Thread einen der synchronisierten Methoden / Blöcke dieser Instanz der Klasse zugreifen zuzugreifen versucht.

anderen Thread Hinweis kann ein Verfahren des gleichen Objekts zuzugreifen, die nicht synchronisiert werden soll, definiert. Ein Thread kann die Sperre wieder freigeben durch den Aufruf

Object.wait()

synchronisiert ist ein Schlüsselwort in Java, die verwendet wird, um vor der Beziehung zu machen geschieht Umgebung in Multithreading-Speicher Inkonsistenz und Fadeninterferenzfehler zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top