2013-07-16 22 views
6

Quando un membro Java deve essere thread-safe, facciamo come la seguente:Come funziona una funzione sincronizzata statica?

public synchronized void func() { 
    ... 
} 

Questa sintassi equivalente a:

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

Cioè, si usa in realtà this per una serratura.

La mia domanda è, se uso synchronized con un metodo static, come segue:

class AA { 
    private AA() {} 

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

In questo caso, su ciò che è la serratura fatta per il metodo synchronized?

+0

La classe AA sarà bloccato 'sincronizzati (AA.class)', ma nessuna istanza –

+3

non è la dichiarazione statica della variabile locale 'obj' un errore di sintassi? – Thilo

risposta

13

In caso di metodo sincronizzato statico, l'oggetto class del class AA sarà blocco implicito

suo equivalente per

class AA { 
    private AA() {} 

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

+1. equivalente a 'synchronized (AA.class) {' – Thilo

+0

ma per quanto riguarda 'static AA obj = new AA();' - non darebbe l'errore di compilazione? – exexzian

+0

sì, ora va bene – exexzian

7

Da section 8.4.3.6 of the JLS:

Procedimento sincronizzato acquisisce un monitor (§17.1) prima dell'esecuzione.

Per un metodo di classe (statico), viene utilizzato il monitor associato all'oggetto Class per la classe del metodo.

Quindi il codice acquisisce il monitor per AA.class. Come sanbhat dice, è come

synchronized(AA.class) { 
    ... 
} 

... proprio come con un metodo di istanza sarebbe

synchronized(this) { 
    ... 
} 
0

Ha funzionato sulla serratura AA.class.

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

} 
Problemi correlati