2013-07-16 5 views
6

Wenn ein Java-Mitglied sein, Thread-sicher braucht, haben wir wie folgt aus:Wie funktioniert eine statische Synchronisierungsfunktion?

public synchronized void func() { 
    ... 
} 

Diese Syntax entspricht:

public void func() { 
     synchronized(this) { 
      .... 
     } 
} 

Das heißt, es tatsächlich nutzt this für ein Schloss.

Meine Frage ist, wenn ich synchronized mit einer static Methode verwenden, wie folgt:

class AA { 
    private AA() {} 

    public static synchronized AA getInstance() { 
     static AA obj = new AA(); 
     return obj; 
    } 
} 

In diesem Fall auf dem, was ist das Schloss für die synchronized Verfahren gemacht?

+0

Die Klasse AA wird gesperrt 'synchronisiert (AA.class)', aber keine Instanzen –

+3

Ist das nicht die statische Deklaration der lokalen Variablen 'obj' einen Syntaxfehler? – Thilo

Antwort

13

Bei statischen Synchron Verfahren wird das class Objekt Ihrer class AA wird impliziten Sperre

seine gleichkommen

class AA { 
    private AA() {} 

    public static AA getInstance() { 
     synchronized(AA.class) { 
      AA obj = new AA(); 
      return obj; 
     } 
    } 
} 
+3

+1. äquivalent zu 'synchronized (AA.class) {' – Thilo

+0

aber was ist mit 'static AA obj = new AA();' - würde es nicht Kompilierzeit Fehler geben? – exexzian

+0

yeah, jetzt ist es in Ordnung – exexzian

7

Von section 8.4.3.6 of the JLS:

Eine synchronisierte Methode erhält einen Monitor (§17.1) bevor es ausgeführt wird.

Bei einer (statischen) Klassenmethode wird der Monitor verwendet, der dem Klassenobjekt für die Klassen der Methode zugeordnet ist.

Ihr Code erfasst den Monitor für AA.class. Wie sanbhat sagt, es ist wie

synchronized(AA.class) { 
    ... 
} 

... genau wie bei einer Instanzmethode wäre es

sein
synchronized(this) { 
    ... 
} 
0

Es auf AA.class Schloss gearbeitet.

public static AA getInstance() { 
     synchronized(AA.class){ 
      static AA obj = new AA(); 
      return obj; 
     } 

} 
Verwandte Themen