>synchronized
synchronized-Schlüsselwort, das zwei Verwendungen umfasst: synchronisierte Methode und synchronisierter Block.
1>synchronisierte Methode: Deklarieren Sie die synchronisierte Methode, indem Sie das synchronisierte Schlüsselwort zur Methodendeklaration hinzufügen.
public synchronisiert void accessVal(int newVal);
Die synchronisierte Methode steuert den Zugriff auf Klassenmitgliedsvariablen: Jede Klasseninstanz entspricht einer Sperre, und jede synchronisierte Methode muss diese erhalten Die Sperre der Klasseninstanz, die diese Methode aufruft, kann ausgeführt werden. Sobald die Methode ausgeführt wird, wird die Sperre erst dann aufgehoben, wenn sie von der Methode zurückgegeben wird Dadurch kann der blockierte Thread die Sperre erhalten und erneut in den ausführbaren Status wechseln. Dieser Mechanismus stellt sicher, dass sich für jede Klasseninstanz gleichzeitig höchstens eine ihrer als synchronisiert deklarierten Mitgliedsfunktionen im ausführbaren Zustand befindet (da höchstens die der Klasseninstanz entsprechende Sperre erhalten werden kann), wodurch die Notwendigkeit effektiv vermieden wird für Klassenmitglieder, um auf Konflikte von Variablen zuzugreifen (solange alle Methoden, die auf Variablen von Klassenmitgliedern zugreifen können, als synchronisiert deklariert sind)
In Java entspricht nicht nur Klasseninstanzen jeder Klasse auch eine Sperre, sodass wir auch statische Mitglieder verwenden können der Klasse Die Funktion wird als synchronisiert deklariert, um ihren Zugriff auf die statischen Mitgliedsvariablen der Klasse zu steuern. Mängel der synchronisierten Methode: Wenn eine große Methode als synchronisiert deklariert wird, wird die Effizienz stark beeinträchtigt. Wenn die Thread-Klassenmethode run() als synchronisiert deklariert wird, wird sie normalerweise während des gesamten Lebenszyklus des Threads weiter ausgeführt . Führt dazu, dass die Aufrufe aller synchronisierten Methoden dieser Klasse niemals erfolgreich sind. Natürlich können wir dieses Problem lösen, indem wir den Code, der auf Klassenmitgliedsvariablen zugreift, in eine spezielle Methode einfügen, ihn als synchronisiert deklarieren und ihn in der Hauptmethode aufrufen, aber Java bietet uns eine bessere Lösung, nämlich den synchronisierten Block.
2> synchronisierter Block: Deklarieren Sie den synchronisierten Block über das synchronisierte Schlüsselwort. Die Grammatik lautet wie folgt:
Synchronisiert (Syncobject) {
// Zugriffskontrolle des Codes zulassen
}
Synchronisierter Block ist ein solcher Codeblock, in dem der Code vorhanden sein muss Erhalten Sie das Objekt Syncobject (Wie bereits erwähnt, kann die Sperre nur ausgeführt werden, wenn es sich um eine Klasseninstanz oder eine Klasse handelt), und der spezifische Mechanismus ist der gleiche wie zuvor erwähnt. Da es auf jeden Codeblock abzielen und das gesperrte Objekt beliebig angeben kann, bietet es eine hohe Flexibilität.
Einige Verständnisse von synchronisiert(this):
1. Wenn zwei gleichzeitige Threads auf den synchronisierten(this)-Synchronisationscodeblock im selben Objektobjekt zugreifen, kann jeweils nur ein Thread ausgeführt werden. Ein anderer Thread muss warten, bis der aktuelle Thread die Ausführung dieses Codeblocks abgeschlossen hat, bevor er diesen Codeblock ausführen kann.
2. Wenn jedoch ein Thread auf einen synchronisierten (diesen) synchronisierten Codeblock des Objekts zugreift, kann ein anderer Thread immer noch auf den nicht synchronisierten (diesen) synchronisierten Codeblock im Objekt zugreifen.
3. Was besonders kritisch ist, ist, dass, wenn ein Thread auf einen synchronisierten (diesen) synchronisierten Codeblock des Objekts zugreift, andere Threads daran gehindert werden, auf alle anderen synchronisierten (diesen) synchronisierten Codeblöcke des Objekts zuzugreifen.