2013-07-16 16 views
6

Gdy członek Java musi być bezpieczny wątku, robimy tak:Jak działa funkcja synchronizacji statycznej?

public synchronized void func() { 
    ... 
} 

tej składni odpowiadający:

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

Oznacza to, że faktycznie korzysta this za zamkiem.

Moje pytanie brzmi, czy mogę używać synchronized z metodą static, co następuje:

class AA { 
    private AA() {} 

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

W tym przypadku, na co jest blokada wykonana dla metody synchronized?

+0

Klasa AA zostaną zablokowane 'zsynchronizowane (AA.class)', ale żadne instancje –

+3

nie jest statycznym deklaracja zmiennej lokalnej 'obj' błąd składni? – Thilo

Odpowiedz

13

W przypadku metody statycznej zsynchronizowane, class przedmiotowi class AA będzie niejawny blokada

jego odpowiednik

class AA { 
    private AA() {} 

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

+1. odpowiednik 'zsynchronizowanej (AA.class) {' – Thilo

+0

, ale co ze statycznym AA obj = nowym AA(); '- czy nie dałoby to błędu podczas kompilacji? – exexzian

+0

tak, teraz to dobrze – exexzian

7

Od section 8.4.3.6 of the JLS:

Zsynchronizowany sposób nabywa monitor (§ 17.1) przed jego wykonaniem.

Dla metody klasowej (statycznej) używany jest monitor powiązany z obiektem klasy dla klasy metody.

Twój kod uzyskuje monitor dla AA.class. Jak sanbhat mówi, to jak

synchronized(AA.class) { 
    ... 
} 

... tak jak z metody instancji byłoby

synchronized(this) { 
    ... 
} 
0

To działało na zamek AA.class.

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

}