2012-09-19 86 views
3

當兩個線程同時使用不同的實例調用靜態同步方法時會發生什麼?可能嗎?對象鎖用於非靜態同步方法,但是什麼類型的鎖用於靜態同步方法?java靜態同步方法

+1

如果提供,靜態方法將忽略實例變量。它甚至可以沒有錯誤地爲空。對於靜態方法,使用類對象。 –

+1

討論http://stackoverflow.com/questions/437620/java-synchronized-methods-lock-on-object-or-class – yair

回答

6

它是一樣的Class對象上同步實現該方法,所以是的,這是可能的,並且是,則該機制有效地忽略來回該方法被稱爲實例:

class Foo { 
    private static synchronized doSomething() { 
     // Synchronized code 
    } 
} 

是一個寫這個的快捷方式:

class Foo { 
    private static doSomething() { 
     synchronized(Foo.class) { 
      // Synchronized code 
     } 
    } 
} 
6

這是可能的。

線程鎖定在該類的Class對象上,如MyClass.class

JLS, Section 8.4.3.6. synchronized Methods

8.4.3.6。同步方法

同步方法在執行之前獲取監視器(第17.1節)。

對於類(靜態)方法中,使用與 Class對象方法的類相關聯的顯示器。

0

靜態同步方法在類型爲java.lang.Class的實例上使用鎖。也就是說,每個可訪問的類都由運行時類型爲Class的對象表示,並且該對象由靜態同步方法使用。

0

當使用靜態鎖定時,對象被忽略。鎖是在課堂而不是對象上獲得的。