Java Multithreading - Synchronblöcke
Der synchronisierte Java -Block wird verwendet, um die synchronisierte Methode oder den Codeblock zu markieren. Java -Synchronisationsblöcke werden verwendet, um den Wettbewerb zu vermeiden. In diesem Artikel wird der folgende Inhalt vorgestellt:
Java synchronisierte Schlüsselwörter (synchronisiert)
Synchronisierte Blöcke in Java sind synchronisiert. Synchronisationsblöcke werden auf einem Objekt in Java synchronisiert. Alle Synchronisationsblöcke, die auf einem Objekt synchronisiert sind, können nur von einem Thread eingegeben und gleichzeitig Vorgänge ausführen. Alle anderen Threads, die darauf warten, den Synchronisationsblock einzugeben, werden blockiert, bis die Threads im Synchronisationsblock ausgeführt werden.
Es gibt vier verschiedene Synchronisationsblöcke:
Die obigen Synchronisationsblöcke sind alle an verschiedenen Objekten synchronisiert. Welcher Synchronisationsblock tatsächlich benötigt wird, hängt von der spezifischen Situation ab.
Instanzmethode Synchronisation
Hier ist eine synchronisierte Beispielmethode:
public synchronisierte void add (int value) {this.count += value; }
Statische Methodesynchronisation
Die statische Methodensynchronisation entspricht der Instanzmethodensynchronisationsmethode, und das synchronisierte Schlüsselwort wird ebenfalls verwendet. Die Synchronisation der statischen Methode von Java lautet wie folgt:
public statische synchronisierte Leere add (int value) {count += value; }In ähnlicher Weise gibt das synchronisierte Schlüsselwort Java an, dass diese Methode synchronisiert ist.
Die Synchronisation statischer Methoden bezieht sich auf die Synchronisation des Klassenobjekts, in dem sich die Methode befindet. Da eine Klasse nur einem Klassenobjekt in einer java -virtuellen Maschine entsprechen kann, darf nur ein Thread in derselben Klasse statische Synchronisationsmethoden ausführen.
Bei statischen Synchronisationsmethoden in verschiedenen Klassen kann ein Thread in jeder Klasse statische Synchronisationsmethoden ausführen, ohne zu warten. Unabhängig von der statischen Synchronisationsmethode in der aufgerufenen Klasse kann eine Klasse nur von einem Thread gleichzeitig ausgeführt werden.
Synchronblöcke in Instanzmethoden
Manchmal müssen Sie nicht die gesamte Methode synchronisieren, sondern einen Teil der Methode synchronisieren. Java kann einen Teil einer Methode synchronisieren.
Ein Beispiel für einen Synchronisationsblock in einer asynchronen Java -Methode ist unten dargestellt:
public void add (int value) {synchronized (this) {this.count += value; }}Beispiele verwenden den Java Synchronous Block Constructor, um ein synchronisiertes Stück Code zu markieren. Dieser Code entspricht der Synchronisationsmethode bei der Ausführung.
Beachten Sie, dass der Java Synchronous Block Constructor das Objekt in Klammern umschließt. Im obigen Beispiel wird "dies" verwendet, dh die Instanz selbst, die die Methode hinzufügen. Objekte, die in Klammern im Synchronisationskonstruktor eingeschlossen sind, werden als Monitorobjekte bezeichnet. Der obige Code verwendet Monitor -Objekt -Synchronisation, und die Synchroninstanzmethode verwendet die Instanz der Aufrufmethode selbst als Monitorobjekt.
Nur ein Thread kann in Java -Methoden ausgeführt werden, die gleichzeitig mit demselben Monitorobjekt synchronisiert sind.
Die folgenden zwei Beispiele synchronisieren das Instanzobjekt, das sie aufrufen, sodass sie dem synchronisierten Ausführungseffekt entsprechen.
öffentliche Klasse MyClass {public synchronisierte void log1 (String msg1, String msg2) {log.writeln (msg1); log.WriteLN (MSG2); } public void log2 (String msg1, String msg2) {synchronisiert (this) {log.writeln (msg1); log.WriteLN (MSG2); }}}Im obigen Beispiel kann in einer der beiden Synchronisationsblöcke gleichzeitig nur ein Thread ausgeführt werden.
Wenn der zweite Synchronisationsblock in diesem Instanzobjekt nicht synchronisiert ist, können die beiden Methoden gleichzeitig mit dem Thread ausgeführt werden.
Synchronblöcke in statischen Methoden
Ähnlich wie oben sind die folgenden Beispiele für zwei statische Methodensynchronisation. Diese Methoden werden auf dem Klassenobjekt synchronisiert, zu dem die Methode gehört.
öffentliche Klasse MyClass {public static synchronisierte void log1 (String msg1, String msg2) {log.writeln (msg1); log.WriteLN (MSG2); } public static void log2 (String msg1, String msg2) {synchronisiert (myclass.class) {log.writeln (msg1); log.WriteLN (MSG2); }}}Diese beiden Methoden erlauben keinen Zugriff nach Threads gleichzeitig.
Wenn der zweite Synchronisationsblock nicht auf dem Objekt der MyClass.Class synchronisiert ist. Anschließend können diese beiden Methoden gleichzeitig mit Threads zugegriffen werden.
Java -Synchronisationsinstanz
Im folgenden Beispiel werden zwei Threads gestartet, wobei beide die add -Methode derselben Instanz der Zählerklasse aufrufen. Da sich die Synchronisation auf der Instanz befindet, zu der die Methode gehört, kann nur ein Thread gleichzeitig auf die Methode zugreifen.
public class counter {long count = 0; public synchronisierte void add (langer Wert) {this.count += value; }} public class couttraad erweitert Thread {geschützter Zähler = null; public crounthead (counter counter) {this.count = counter; } public void run () {für (int i = 0; i <10; i ++) {counter.add (i); }}} public class Beispiel {public static void main (String [] args) {counter counter = new counter (); Threada = neuer Probsthead (Zähler); Thread Thread = neuer Probsthead (Zähler); threada.start (); threadb.start (); }}Es wurden zwei Themen erstellt. Ihr Konstruktor bezieht sich auf die gleiche Zählerinstanz. Die Zähler.ADD -Methode wird in einer Instanz synchronisiert, da die Add -Methode eine Instanzmethode ist und mit dem synchronisierten Schlüsselwort markiert ist. Daher darf nur ein Thread die Methode gleichzeitig aufrufen. Ein weiterer Thread muss warten, bis der erste Thread die Methode add () verlässt, bevor die Methode fortgesetzt wird.
Wenn sich zwei Threads auf zwei verschiedene Zählerinstanzen beziehen, können sie gleichzeitig die Methode add () aufrufen. Diese Methoden rufen verschiedene Objekte auf, sodass diese Methoden an verschiedenen Objekten synchronisiert sind. Diese Methodenaufrufe werden nicht blockiert. Wie im folgenden Beispiel gezeigt:
Beispiel für public class {public static void main (String [] args) {conter campa = new counter (); Counter counterb = neuer counter (); Threada = neuer Proteste (Countera); Thread Thread = neuer Proteste (Counterb); threada.start (); threadb.start (); }}Beachten Sie, dass diese beiden Threads, Threada und Faden nicht mehr auf dieselbe Zählerinstanz verweisen. Die Add -Methoden von Countera und Counterb werden auf dem Objekt synchronisiert, zu dem sie gehören. Das Aufrufen von Conteras Add -Methode blockiert den Aufruf nicht auf die Add -Methode von CounterB.
Das obige ist eine Erklärung für das Wissen über Java-Synchronisationsblöcke von Java. Wir werden in Zukunft weiterhin relevante Informationen hinzufügen. Vielen Dank für Ihre Unterstützung für diese Seite!