Heim > Java > javaLernprogramm > Wie Java Synchronized verwendet, um eine Multithread-Synchronisation zu erreichen

Wie Java Synchronized verwendet, um eine Multithread-Synchronisation zu erreichen

PHPz
Freigeben: 2023-04-30 16:19:07
nach vorne
1048 Leute haben es durchsucht

Gründe für die Verwendung der Synchronisierung

1. Für den Zugriff auf Klassen im System müssen

2 verwendet werden. Es gibt Klassenvariablen in der Klasse oder es wird auf öffentliche Ressourcen (z. B. eine externe Datei) in der Klassenmethode zugegriffen . Lesen und Schreiben).

Welcher Inhalt ist durch die Synchronisierungssperre gesperrt?

Unabhängig davon, ob Sie Synchronized vor einer Methode oder einer Variablen hinzufügen, wird ein Klassenobjekt gesperrt. Jedem Objekt ist nur eine Sperre zugeordnet.

In den folgenden Beispielen werden die Synchronisationseffekte in verschiedenen Situationen aufgeführt

1. Synchronized wird zur Methode hinzugefügt (synchronisierte Methode, Sperrklasseninstanz)

Java-Code

public class Demo1 {             public synchronized void m1(){             //...............         }             public void m2(){             //............                 synchronized(this){                 //.........             }                 //........         }     }
Nach dem Login kopieren

Die Wirkung dieser beiden Schreibmethoden ist ebenfalls: Alle gesperrten Objekte sind Klasseninstanzobjekte. Wenn es ein Klasseninstanzobjekt gibt: demo = new Demo1(), und es zwei Threads gibt: Thread1, Thread2, die beide das Demo-Objekt aufrufen. Wenn Thread1 gleichzeitig demo.m1() aufruft, ist Thread2 vorhanden Auf demo.m1() und demo.m2() kann während dieser Zeit nicht zugegriffen werden, da Thread1 die Sperre des Demo-Objekts verwendet. Wenn Thread1 jedoch demo1.m1() aufruft, kann Thread2 nicht zugewiesen werden ruft demo2 .m1() auf und kann gleichzeitig ausgeführt werden, da sie verschiedene Objektinstanzen der Demo1-Klasse aufrufen.

2. Synchronisiert wird zur Variablen hinzugefügt (synchronisierter Block, gesperrte Klasseninstanz)

Java-Code

public class Demo2 {         Object a = new Object();         Object b = new Object();             public void m1(){             //............                 synchronized(a){                 //.........             }                 //........         }             public void m2(){             //............                 synchronized(b){                 //.........             }                 //........         }     }
Nach dem Login kopieren
In diesem Fall wird die Codeblocksperre implementiert und das gesperrte Objekt ist Variable a oder b; , a und b sind beide nicht statisch) Wenn es ein Klasseninstanzobjekt gibt: demo = new Demo2(), und es zwei Threads gibt: Thread1, Thread2, die beide Demo-Objekte aufrufen, dann gleichzeitig, wenn Thread1 aufruft demo.m1(), dann kann Thread2 innerhalb dieser Zeit auf demo.m2() zugreifen, aber nicht auf den Synchronisationsblock von demo.m1(), da a von thread1 gesperrt ist.

3. Synchronisierte Sperrklassenvariablen, also statische Variablen (können Attribute oder Methoden sein) (Sperrklassenobjekte)

Java-Code

public class Demo3 {         static Object o = new Object();             public static synchronized void m1() {             //....         }             public static void m2() {             //...             synchronized (Demo3.class) {                 //.....             }             //.....         }             public static void m3() {             //..........             try {                 synchronized (Class.forName("Demo3")) {                   //............                 }             } catch (ClassNotFoundException ex) {             }             //.............         }             public static void m4() {             //............            synchronized(o){              //........            }             //..........         }     }
Nach dem Login kopieren
Die mit den oben genannten vier Methoden erzielten Effekte sind die gleichen Gesperrte Objekte sind alle Demo3-Klassen und keine Klasseninstanzobjekte. Das heißt, in Multithreads gehören die gemeinsam genutzten Ressourcen zu Klassen und nicht zu Klassenobjekten. Wenn in diesem Fall Thread1 auf eine dieser vier Methoden zugreift, kann kein anderer Thread gleichzeitig auf diese vier Methoden zugreifen.

4. Auf die Ressource, die mehreren Threads gemeinsam ist, wird in der Klassenmethode zugegriffen, und die Ressource ist variabel. In diesem Fall ist auch eine Synchronisierung erforderlich kann nicht für Klasseninstanzobjekte gesperrt werden, da es sich hierbei um eine Art Klassenressourcenfreigabe von Variablen und nicht um Klasseninstanzobjektressourcenfreigabe handelt.

Threads haben ihre eigene Art von Erfolg und Misserfolg. Wenn sie richtig eingesetzt werden, können sie die Leistung verbessern, aber wenn sie unsachgemäß verwendet werden, verursachen sie endlose Probleme für das System.

PS: Die Thread-Synchronisierung erfordert viel Systemaufwand. Wenn dies nicht erforderlich ist, versuchen Sie, die Synchronisierungsfunktion nicht zu verwenden.

Das obige ist der detaillierte Inhalt vonWie Java Synchronized verwendet, um eine Multithread-Synchronisation zu erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage