2013-07-16 50 views
6

當Java成員需要是線程安全的,我們做如下所示:靜態同步函數是如何工作的?

public synchronized void func() { 
    ... 
} 

此語法相當於:

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

也就是說,它實際上使用this一個鎖。

我的問題是,如果我使用​​一個static方法,如下所示:

class AA { 
    private AA() {} 

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

在這種情況下,什麼是鎖的​​方法制成的?

+0

的AA級將被鎖定'同步(AA.class)',但沒有實例 – 2013-07-16 05:49:48

+3

不在本地變量'obj'語法錯誤的靜態聲明? – Thilo

回答

13

在靜態同步方法的情況下,你class AA將隱式鎖

其相當於

class AA { 
    private AA() {} 

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

+1。相當於'synchronized(AA.class){' – Thilo

+0

但是'static AA obj = new AA();' - 會不會給編譯時錯誤? – exexzian

+0

是的,現在它的罰款 – exexzian

7

class對象從section 8.4.3.6 of the JLS

甲同步方法獲取監視器(§17.1),然後執行。

對於類(靜態)方法,使用與方法類的Class對象關聯的監視器。

因此,您的代碼獲取AA.class的顯示器。作爲sanbhat說,它就像

synchronized(AA.class) { 
    ... 
} 

...只是作爲對實例的方法將是

synchronized(this) { 
    ... 
} 
0

它工作在AA.class鎖。

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

}