Frage

Die Java Tutorials sagen: „Es ist für zwei Anrufungen von synchronisierten Methoden auf dem gleichen Objekt nicht möglich ist, verschachteln.“

Was bedeutet das für eine statische Methode? Da eine statische Methode keine verknüpfte Objekt hat, wird anstelle des Objekts die synchronisierte Schlüsselwort Sperre für die Klasse?

War es hilfreich?

Lösung

  

Da eine statische Methode hat kein zugehöriges Objekt, wird die Schlüsselwort synchronized Sperre für die Klasse, anstelle des Objekts?

Ja. :)

Andere Tipps

Nur ein kleines Detail zu Oscar (erfreulicherweise prägnanten!) Antwort hinzuzufügen, der entsprechende Abschnitt auf der Java Language Specification ist 8.4.3.6, 'synchronisiert Methods' :

  

Eine synchronisierte Methode erhält einen Monitor (§17.1), bevor sie ausgeführt wird. Für eine Klasse (statisch) Methode, der Monitor mit dem Class-Objekt für die Methode der Klasse zugeordnet ist, verwendet. Verfahren für eine Instanz der Monitor mit diesem verbunden ist (das Objekt, für das die Methode aufgerufen wurde) verwendet wird.

Ein Punkt muss man vorsichtig sein (mehrere Programmierer im Allgemeinen in dieser Falle tappen) ist, dass es keine Verbindung zwischen synchronisierten statischen Methoden und sync'ed nicht statischen Methoden, das heißt:

class A {
    static synchronized f() {...}
    synchronized g() {...}
}

Main:

A a = new A();

Gewinde 1:

A.f();

Thread 2:

a.g();

f () und g () sind nicht miteinander synchronisiert und können somit völlig parallel ausgeführt werden.

Wenn Sie nicht implementieren g () wie folgt:

g() {
    synchronized(getClass()) {
        ...
    }
}

Ich finde dieses Muster auch nützlich, wenn ich mutual exclusion zwischen den verschiedenen Instanzen des Objekts implementieren wollen (was erforderlich ist, wenn accesing eine externe Ressource, zum Beispiel).

Hier finden Sie aktuelle Oracle-Dokumentation Seite auf Intrinsic Schlösser und Synchronisation

  

Sie fragen sich vielleicht, was passiert, wenn eine statische Synchron Methode aufgerufen wird, da eine statische Methode mit einer Klasse zugeordnet ist, kein Objekt. In diesem Fall erhält der Faden die intrinsische Sperre für das Class-Objekt mit der Klasse zugeordnet . So Zugriff auf Klasse statische Felder wird von einem Schloss gesteuert, die von der Sperre für jede Instanz der Klasse verschieden ist .

Eine statische Methode hat auch ein zugehöriges Objekt. Es gehört Datei in JDK Toolkit Class.class. Wenn die .class-Datei lädt in den ram, schafft der Class.class eine Instanz davon genannt Vorlagenobjekt.

Zum Beispiel: - wenn Sie versuchen, Objekt aus bestehenden Kundenklasse wie

erstellen
Customer c = new Customer();

Die Customer.class Last in den Arbeitsspeicher. In diesem Moment erzeugt Class.class in JDK-Toolkit eine Objektvorlage Objekt und Last genannt, dass Customer.class in diese Vorlage object.Static Mitglieder dieser Customer.class werden Attribute und Methoden in diesem Vorlagenobjekt.

So eine statische Methode oder Attribut auch ein Objekt hat

Im Folgenden Beispiele gibt mehr Klarheit zwischen Klassen- und Objektsperre, Hoffnung unter Beispiel andere helfen auch:)

Zum Beispiel haben wir unter Methoden eine acquire Klasse und andere acquire Objektsperre:

public class MultiThread {

    public static synchronized void staticLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }

    public synchronized void objLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

So, jetzt können wir folgende Szenarien:

  1. Wenn Fäden mit gleichem Objekt versuchen objLock zuzugreifen oder staticLock Verfahren gleichzeitig (d.h. beiden Fäden versuchen, dieselbe Methode zuzugreifen)

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  2. Wenn Fäden mit gleiches Objekt versucht staticLock und objLock Methoden gleichzeitig zuzugreifen (verschiedene Methoden versucht Zugriff)

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    
  3. Wenn Threads anderes Objekt versucht staticLock Methode für den Zugriff auf

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  4. Wenn Threads anderes Objekt versucht objLock Methode für den Zugriff auf

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    

Für diejenigen, die nicht vertraut sind statisch synchronisierte Methode auf Klassenobjekt gesperrt sind z.B. für String-Klasse seiner String.class während Instanz synchronisierte Methode Sperren auf aktuelle Instanz von Objekt durch „dieses“ Schlüsselwort in Java bezeichnet. Da diese beiden Objekte unterschiedlich sind haben sie unterschiedliche Sperre so während ein Thread statische synchronisierte Methode ausgeführt wird, anderer Thread in Java braucht nicht zu warten, für diesen Thread statt zurückzukehren wird es separaten Schloss bezeichnet Byte .class- literal erwerben und tritt in static synchronisierte Methode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top