In diesem Artikel werden einige Wissenspunkte über synchronisierte Schlüsselwörter in Java Multithreading als Objektsperrungen vorgestellt.
Die sogenannte Objektschloss bedeutet synchronisiert, ein bestimmtes Objekt zu sperren. Als Referenz finden Sie unter: Dieser Artikel
1. Analyse
Synchronisiert kann die Instanzmethode wie folgt ändern:
öffentliche Klasse MyObject {synchronisierte public void methoda () {// etwas tun ....}Hier sperrt das synchronisierte Schlüsselwort das aktuelle Objekt. Dies wird auch als Objektschloss bezeichnet.
Warum das aktuelle Objekt sperren? Da methoda () eine Instanzmethode ist, müssen Sie sie in Form eines Objekts aufrufen, wenn Sie Methoda () ausführen möchten. method () (obj.methoda (), obj ist ein Objekt der MyObject -Klasse, synchronisierte Mittelwerte, die das OBJ -Objekt sperren).
Der obige Code kann auch so geschrieben werden:
public class myObject {public void methoda () {synchronisiert (this) {// etwas tun ....}}2. Merkmale
Eine offensichtliche Merkmal der synchronisierten Schlüsselwortsynchronisation ist, dass, wenn mehrere synchronisierte modifizierte Instanzmethoden in der MyObject -Klasse definiert sind. Wenn mehrere Threads das gleiche Objekt der MyObject -Klasse haben, können diese Methoden nur synchron ausgeführt werden. Das heißt, nach der Ausführung einer synchronisierten Modifikationsmethode kann eine weitere synchronisierte Modifikationsmethode ausgeführt werden.
wie folgt:
public class myObject {synchronisierte public void methoda () {// etwas tun ....} synchronisierte public void methodb () {// etwas anderes Ding}}In der MyObject -Klasse gibt es zwei synchronisierte Modifikationsmethoden.
öffentliche Klasse Threada erweitert Thread {private myObject Object; // weglasse den Konstruktor @Override public void run () {Super.run (); Object.Methoda (); }}Thread A führt methoda () aus
public class thread erweitert Thread {private myObject Object; // weglasse den Konstruktor @Override public void run () {super.run (); Object.Methodb (); }} Thread B führt methodb () aus
public class run {public static void main (String [] args) {myObject Object = new myObject (); // Thread A und Thread B halten dasselbe Objekt: Objekt Threada a = new Threada (Objekt); Faden B = neuer Taste (Objekt); A.Start (); b.Start (); }}Da Thread A und Thread B das Objektobjekt derselben MyObject -Klasse enthalten, müssen diese beiden Threads unterschiedliche Methoden aufrufen, aber sie müssen synchronisiert werden. Zum Beispiel muss Thread B warten, bis Thread A die Methode () () ausführen kann, bevor die Methodeb () -Methode ausgeführt wird.
3. Schlussfolgerung
Wie aus den oben genannten Erscheinen hervorgeht, ist der Umfang der in diesem Artikel beschriebenen synchronisierten Schloss das gesamte Objekt. Wenn in einer Klasse mehrere synchronisierte modifizierte Synchronisationsmethoden vorhanden sind und mehrere Threads dasselbe Objekt der Klasse (das gleiche Objekt der Klasse) enthalten, wird auch die Ausführung jeder Methode synchronisiert.
Wenn zwischen jeder synchronisierten Methode keine gemeinsam genutzten Variablen vorhanden sind oder keine Verbindung zwischen jeder Methode besteht, aber nur synchron ausgeführt werden kann, wirkt sich dies auf die Effizienz aus.
4. Anwendung-Verwenden Sie synchronisiert
Das folgende Beispiel:
öffentliche Klasse MyObject {private String username = "b"; private String password = "bb"; Synchronisierte public void methoda (String -Benutzername, String -Passwort) {this.username = userername; try {thread.sleep (5000); } catch (InterruptedException e) {} this.password = password; } synchronisierte public void methodb () {System.out.println ("Benutzername" + Benutzername + ":" + "Passwort" + Passwort); }}Methoda () ist für die Änderung des Benutzernamens und des Passworts verantwortlich. In Wirklichkeit entspricht ein Benutzername einem Passwort.
Methodb () ist für das Lesen des Benutzernamens und des Passworts verantwortlich.
Wenn methodb () nicht mit synchronisiertem Synchron geändert wird, ändert sich der Benutzername beim Aufrufen von Methoda () in Zeile 7 und gibt die CPU aus irgendeinem Grund auf (z. B. in Zeile 9).
Wenn Thread b zu diesem Zeitpunkt Methodeb () ausführt, ist der Benutzername -Lesen der Benutzername, der durch Thread A ("A") geändert wurde, aber das Passwort ist das ursprüngliche Passwort ("BB"). Weil Thread A schläft und keine Zeit hatte, das Passwort zu ändern.
Wenn Methodb () jedoch mit synchronisiertem Thread B geändert wird, kann Thread B nur darauf warten, dass Thread A die Ausführung (dh den Benutzernamen und das Kennwort geändert hat), bevor Methodb zum Lesen des Benutzernamens und des Kennworts ausgeführt wird. Daher werden schmutzige Lesenprobleme, die durch Inkonsistenz bei Daten verursacht werden, vermieden.
Das obige dreht sich alles um diesen Artikel. Ich hoffe, dass es für alle hilfreich sein wird, Java -Programme zu lernen.