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){ //......... } //........ } }
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){ //......... } //........ } }
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){ //........ } //.......... } }
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!