Das synchronisierte Schlüsselwort hat zwei Verwendungszwecke. Die erste besteht darin, es direkt in der Definition der Methode zu verwenden, wie im Artikel „Verwenden des Schlüsselworts Synchronized zum Synchronisieren von Klassenmethoden“ beschrieben. Ein anderer Typ ist der synchronisierte Block. Wir können eine Objektvariable nicht nur über synchronisierte Blöcke synchronisieren. Sie können synchronisierte Blöcke auch verwenden, um statische und nicht statische Methoden in einer Klasse zu synchronisieren.
Die Syntax des synchronisierten Blocks lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
öffentliche void-Methode()
{
… …
synchronisiert(Ausdruck)
{
… …
}
}
1. Synchronisierung nicht statischer Klassenmethoden
Aus dem Artikel „Verwenden des Schlüsselworts Synchronized zum Synchronisieren von Klassenmethoden“ wissen wir, dass die Verwendung des Schlüsselworts synchronisiert zum Definieren von Methoden alle statischen oder nicht statischen Methoden sperrt, die mit dem Schlüsselwort synchronisiert in der Klasse definiert wurden. Dies ist jedoch nicht leicht zu verstehen. Und wenn Sie synchronisierte Blöcke verwenden, um denselben Effekt zu erzielen, ist es nicht schwer zu verstehen, warum dieser Effekt auftritt. Wenn Sie einen synchronisierten Block verwenden möchten, um alle synchronen nicht statischen Methoden in einer Klasse zu sperren, müssen Sie diesen als Parameter des synchronisierten Blocks verwenden und ihn an das Land des synchronisierten Blocks übergeben.
Synchronisieren Sie nicht statische Methoden durch synchronisierte Blöcke
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse SyncBlock
{
public void method1()
{
synchronisiert(this) // Entspricht der Verwendung des synchronisierten Schlüsselworts für die Methode method1
{
… …
}
}
public void method2()
{
synchronisiert(this) // Entspricht der Verwendung des synchronisierten Schlüsselworts für die Methode method2
{
… …
}
}
öffentliche synchronisierte Void-Methode3()
{
… …
}
}
Im obigen Code werden synchronisierte Blöcke in den Methoden method1 und method2 verwendet. Die Methode method3 in Zeile 017 verwendet weiterhin das synchronisierte Schlüsselwort, um die Methode zu definieren. Bei Verwendung derselben SyncBlock-Klasseninstanz werden die anderen beiden Methoden blockiert, solange eine der drei Methoden ausgeführt wird, da die Synchronisationssperre nicht erhalten wird. Um bei Verwendung des synchronisierten Blocks den gleichen Effekt wie das synchronisierte Schlüsselwort zu erzielen, muss der gesamte Code in den synchronisierten Block geschrieben werden. Andernfalls wird der gesamte Code in der aktuellen Methode nicht mit anderen Methoden synchronisiert.
Zusätzlich zur Verwendung als Parameter des synchronisierten Blocks können Sie auch SyncBlock.this als Parameter des synchronisierten Blocks verwenden, um den gleichen Effekt zu erzielen.
Bei Verwendung des synchronisierten Blocks in der Methode der inneren Klasse (InnerClass) stellt dieser nur die innere Klasse dar und hat nichts mit der äußeren Klasse (OuterClass) zu tun. Aber nicht statische Methoden der inneren Klasse können mit nicht statischen Methoden der äußeren Klasse synchronisiert werden. Fügen Sie beispielsweise der inneren Klasse InnerClass eine Methode method4 hinzu und synchronisieren Sie die Methode method4 mit den drei Methoden von SyncBlock. Der Code lautet wie folgt:
Synchronisieren Sie die nicht statischen Methoden der inneren Klasse mit den nicht statischen Methoden der äußeren Klasse
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse SyncBlock
{
… …
classInnerClass
{
public void method4()
{
synchronisiert(SyncBlock.this)
{
… …
}
}
}
… …
}
In der neuen Version der SyncBlock-Klasse oben wird die Methode 4 der InnerClass-Klasse mit den anderen drei Methoden der SyncBlock-Klasse synchronisiert. Daher kann nur eine der vier Methoden Methode1, Methode2, Methode3 und Methode4 ausgeführt werden zur gleichen Zeit.
Unabhängig davon, ob der synchronisierte Block normal ausgeführt wird oder aufgrund eines Programmfehlers den synchronisierten Block abnormal verlässt, wird die vom aktuellen synchronisierten Block gehaltene Synchronisationssperre automatisch aufgehoben. Daher müssen Sie sich bei der Verwendung synchronisierter Blöcke keine Gedanken über die Freigabe von Synchronisationssperren machen.
2. Synchronisierung statischer Klassenmethoden
Denn beim Aufruf einer statischen Methode wird nicht unbedingt die Objektinstanz erstellt. Daher können Sie dies nicht zum Synchronisieren statischer Methoden verwenden, Sie müssen jedoch Klassenobjekte verwenden, um statische Methoden zu synchronisieren. Der Code lautet wie folgt:
Synchronisieren Sie statische Methoden durch synchronisierte Blöcke
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse StaticSyncBlock
{
öffentliche statische Void-Methode1()
{
synchronisiert (StaticSyncBlock.class)
{
… …
}
}
öffentliche statische synchronisierte void-Methode2()
{
… …
}
}
Beim Synchronisieren statischer Methoden können Sie die statische Feldklasse der Klasse verwenden, um das Klassenobjekt abzurufen. Im obigen Beispiel kann nur eine Methode von Methode1 und Methode2 gleichzeitig ausgeführt werden. Zusätzlich zur Verwendung des Klassenfelds zum Abrufen des Klassenobjekts können Sie auch die getClass-Methode der Instanz verwenden, um das Klassenobjekt abzurufen. Der Code im obigen Beispiel kann wie folgt geändert werden:
Verwenden Sie die getClass-Methode, um das Class-Objekt abzurufen
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse StaticSyncBlock
{
öffentliche statische StaticSyncBlock-Instanz;
öffentlicher StaticSyncBlock()
{
Instanz = dies;
}
öffentliche statische Void-Methode1()
{
synchronisiert(instance.getClass())
{
}
}
}
Im obigen Code wird eine Instanz der StaticSyncBlock-Klasse über eine öffentliche statische Instanz abgerufen, und das Klassenobjekt wird über die getClass-Methode dieser Instanz abgerufen (alle Instanzen einer Klasse erhalten dasselbe Klassenobjekt über die getClass-Methode, daher Der Aufruf einer beliebigen getClass-Methode einer Instanz kann verwendet werden. Wir können auch statische Methoden verschiedener Klassen über Klassenobjekte synchronisieren, z. B. die statische Methodenmethode der Testklasse und die beiden statischen Methoden der StaticSyncBlock-Klasse. Der Code lautet wie folgt:
Die Methodenmethode der Testklasse wird mit den Methoden method1 und method2 der StaticSyncBlock-Klasse synchronisiert.
Kopieren Sie den Codecode wie folgt:
Öffentlicher Klassentest
{
öffentliche statische Void-Methode()
{
synchronisiert (StaticSyncBlock.class)
{
}
}
}
Hinweis: Bei Verwendung synchronisierter Blocksynchronisierungsklassenmethoden können nicht statische Methoden dies zum Synchronisieren verwenden, während statische Methoden zum Synchronisieren das Klassenobjekt verwenden müssen. Sie beeinflussen sich gegenseitig nicht. Natürlich können Sie Klassenobjekte auch in nicht statischen Methoden verwenden, um statische Methoden zu synchronisieren. Dies kann jedoch in statischen Methoden nicht zum Synchronisieren nicht statischer Methoden verwendet werden. Dies sollte bei der Verwendung synchronisierter Blocksynchronisationsklassenmethoden beachtet werden.