Zeichnen Sie einfach auf, wie das synchronisierte Schlüsselwort in Java verwendet wird.
Vor der Einführung muss klargestellt werden, dass jeder Objektinstanz einer Klasse in Java nur eine Sperre (Sperre) zugeordnet ist. Das synchronisierte Schlüsselwort wirkt sich nur auf diese Sperre aus, das heißt, es kann als nur synchronisiert betrachtet werden wirkt sich auf Objektinstanzen der Java-Klasse aus.
synchronisierte modifizierte Funktion
Kopieren Sie den Codecode wie folgt:
öffentlich synchronisierte aMethod(){
}
Dies ist das am häufigsten verwendete Szenario. Was ist also der Zweck dieser Synchronisierungsmethode? Der Einfachheit halber wird sie als Methodenmethode bezeichnet.
1. Welche synchronisierte Sperre ist die Objektinstanz, die diese Synchronisationsmethode aufruft? Die Synchronisation erfolgt beispielsweise, wenn dieselbe Instanz P1 eine Methode in verschiedenen Threads aufruft.
2. Es ist zu beachten, dass ein anderes Objekt P2 der Klasse, zu der dieses Objekt gehört, diese aMethode beliebig aufrufen kann, da sich die synchronisierten Methoden verschiedener Objektinstanzen nicht gegenseitig stören. Mit anderen Worten: Andere Threads können weiterhin gleichzeitig auf die aMethod-Methode in einer anderen Objektinstanz derselben Klasse zugreifen.
3. Wenn ein Objekt über mehrere synchronisierte Methoden wie aMethod, bMethod und cMethod verfügt, können andere Threads nicht gleichzeitig auf eine synchronisierte Methode im Objekt zugreifen, solange ein Thread auf eine der synchronisierten Methoden zugreift.
Der obige Code entspricht tatsächlich dem folgenden:
Kopieren Sie den Codecode wie folgt:
public void aMethod() {
synchronisiert (dies) {
}
}
Dies bezieht sich hier auf die Referenz des Instanzobjekts, z. B. P1. Es ist ersichtlich, dass der Kern der Synchronisationsmethode darin besteht, die Synchronisation auf die Objektreferenz anzuwenden. Nur der Thread, der die P1-Objektsperre erhalten hat, kann die Synchronisationsmethode von P2 aufrufen. Die P1-Sperre hat damit nichts zu tun. Das Programm kann dabei auch die Kontrolle über den Synchronisationsmechanismus verlieren Situation, was zu Datenverwirrung führt. Daraus leiten wir den folgenden Synchronisationsblock ab.
synchronisierter geänderter Codeblock
Kopieren Sie den Codecode wie folgt:
public void dMethod(SomeObject so) {
synchronisiert(so) {
}
}
Die hier durch Synchronisierung erhaltene Sperre ist die Sperre des so-Objekts, sodass jeder, der die Sperre erhält, den von ihm kontrollierten Code ausführen kann. Wenn ein klares Objekt als Sperre vorhanden ist, können Sie das Programm wie folgt schreiben. Wenn jedoch kein klares Objekt als Sperre vorhanden ist und Sie nur einen Codeabschnitt synchronisieren möchten, können Sie eine spezielle Instanzvariable erstellen (dies muss der Fall sein). ein Objekt), das als Sperre fungiert:
Kopieren Sie den Codecode wie folgt:
Klasse Foo implementiert Runnable {
privates Byte[] lock = neues Byte[0];
Öffentliche void-Methode() {
synchronisiert(Sperre) {
}
}
}
Die Erstellung eines Byte-Array-Objekts mit der Länge Null ist kostengünstiger als die Erstellung jedes anderen Objekts.
synchronisierte modifizierte statische Methode
Wie bereits erwähnt, ist das synchronisierte Schlüsselwort nur für P1-Instanzen in verschiedenen Threads gültig. Die Antwort besteht darin, synchronisierte statische Methoden zu verwenden Man kann sagen, dass eine Klasse dieser Klasse gehört. Sie ist nicht auf Instanzen dieser Klasse angewiesen. Daher müssen wir nur das Schlüsselwort „synchonized“ verwenden, um die statischen Methoden der Klasse zu ändern und eine Synchronisierung zwischen verschiedenen Instanzen zu erreichen.