it-swarm.com.de

Was ist die Verwendung von statisch synchronisierten Methoden in Java?

Ich habe eine Frage im Kopf, ich lese statisch synchronisierte Methoden, die für Klassenobjekt .__ gesperrt sind, und synchronisierte Methodensperren für die aktuelle Instanz eines Objekts.So Was bedeutet gesperrt.

Kann mir bitte jemand bei diesem Thema helfen?

35
snehal

Im Allgemeinen werden synchronized-Methoden verwendet, um den Zugriff auf Ressourcen zu schützen, auf die gleichzeitig zugegriffen wird. Wenn eine Ressource, auf die gleichzeitig zugegriffen wird, zu jeder Instanz Ihrer Klasse gehört, verwenden Sie eine synchronized-Instanzmethode. Wenn die Ressource zu allen Instanzen gehört (d. h. wenn sie sich in einer Variablen static befindet), verwenden Sie eine synchronized static-Methode, um darauf zuzugreifen.

Sie können beispielsweise eine Factory-Methode static erstellen, die eine "Registrierung" aller von ihr erzeugten Objekte enthält. Ein natürlicher Ort für eine solche Registrierung wäre eine static-Sammlung. Wenn Ihre Factory von mehreren Threads verwendet wird, müssen Sie die Factory-Methode synchronized festlegen (oder über einen synchronized-Block innerhalb der Methode verfügen), um den Zugriff auf die gemeinsam genutzte static-Sammlung zu schützen.

Beachten Sie, dass die Verwendung von synchronized ohne ein bestimmtes Sperrobjekt im Allgemeinen nicht die sicherste Wahl ist, wenn Sie eine Bibliothek erstellen, die in von anderen Benutzern geschriebenem Code verwendet werden soll. Dies liegt daran, dass bösartiger Code möglicherweise mit Ihrem Objekt oder einer Klasse synchronisiert wird, um die Ausführung Ihrer eigenen Methoden zu blockieren. Um Ihren Code davor zu schützen, erstellen Sie ein privates Sperrobjekt, eine Instanz oder eine statische Instanz und synchronisieren Sie stattdessen dieses Objekt.

58
dasblinkenlight

Zur Laufzeit hat jede geladene Klasse eine Instanz eines Class -Objekts. Dies ist das Objekt, das von den static synchronized-Methoden als gemeinsames Sperrobjekt verwendet wird. (Jede synchronisierte Methode oder jeder Block muss für some Shared Object gesperrt sein.)

Sie können dieses Objekt bei Bedarf auch manuell synchronisieren (ob in einer statischen Methode oder nicht). Diese drei Methoden verhalten sich gleich und erlauben jeweils nur einen Thread in den inneren Block:

class Foo {
    static synchronized void methodA() {
        // ...
    }

    static void methodB() {
        synchronized (Foo.class) {
            // ...
        }
    }

    static void methodC() {
        Object lock = Foo.class;
        synchronized (lock) {
            // ...
        }
    }
}

Der beabsichtigte Zweck von static synchronized-Methoden ist, wenn Sie jeweils nur einen Thread zulassen möchten, um einen veränderbaren Status zu verwenden, der in static-Variablen einer Klasse gespeichert ist.

Heutzutage bietet Java in Java.util.concurrent und seinen Unterpaketen leistungsfähigere Parallelitätsfunktionen, aber die grundlegenden Java 1.0-Konstrukte wie synchronized-Methoden sind noch gültig und verwendbar.

48
Boann

In einfachen Worten sperrt eine static synchronized-Methode die Klasse anstelle des Objekts und die Klasse, da das Schlüsselwort static bedeutet: "Klasse statt Instanz".

Das Schlüsselwort synchronized bedeutet, dass jeweils nur ein Thread auf die Methode zugreifen kann.
Und static synchronized bedeutet: 

Nur ein Thread kann gleichzeitig auf die Klasse zugreifen.

32
Luis Pena

statische Methoden können synchronisiert werden. Sie haben jedoch eine Sperre pro Klasse. Wenn die Java-Klasse geladen wird, ist das entsprechende Java.lang.class-Klassenobjekt vorhanden. Die Sperre dieses Objekts ist für synchronisierte statische Methoden erforderlich. Wenn Sie also ein statisches Feld haben, auf das von mehreren Threads gleichzeitig zugegriffen werden soll, können Sie diese Felder als privat festlegen und öffentliche statische Setter oder Getter erstellen, um auf diese Felder zuzugreifen.

0
Sarala Kumarage

Angenommen, eine Klasse enthält mehrere statische synchronisierte Methoden (m1, m2, m3, m4), und ein Thread greift auf m1 zu. Dann kann kein anderer Thread gleichzeitig auf andere statische synchronisierte Methoden zugreifen.

0
Aman Gupta