2011-06-22 105 views
2

可能重複:
How do synchronized static methods work in Java?Java的靜態同步

有人可以讓我瞭解以下兩個功能之間的根本區別:

public static void synchronized f() {… } 

public void synchronized f() {… } 
+0

@ Oli鏈接中的[第二個答案](http://stackoverflow.com/questions/578904/how-do-synchronized-static-methods-work-in-java/582500#582500)直接回答了這個問題。 –

回答

12

public void synchronized f(){...} 

同步的情況下是每包圍類的實例。這意味着多個線程可以調用f不同的類實例。

對於

public static void synchronized f(){...} 

在一個時間只有一個線程可以調用該方法,無論封閉類的實例的數量的。

技術上,通過​​在第一示例中所採取的顯示器是對象實例和監視器的採取在第二個例子是,Class對象的。

需要注意的是,如果你有相同名稱的類在不同ClassLoaders,該共享同一個顯示器,但是這是你不可能遇到一個細節。

+0

是否有替代Java中的「synchronized」,比如說我們有相同的線程訪問限制,沒有使用「synchronized」關鍵字? – randon

+1

通過使用其中一個['Lock'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock),可以獲得與'synchronized'相同的語義。 html)的實現。 –

1

我認爲:

public void synchronized f() {… }同步於對象本身(this

public static void synchronized f() {… }同步上(object.getClass()SomeClass.getClass)的對象的Class實例

我可以是錯誤

+0

如果它是一個靜態方法,this.getClass()'沒有意義。我認爲你的意思是'SomeClass.class'。 –

+0

@Mark是的,謝謝。我將編輯我的帖子。無論如何,我是否正確? – Thresh

0

假設方法f在Foo類中。靜態版本將鎖定類級別的靜態方法調用(由getClass()或Foo.class返回的對象)。非靜態版本將鎖定爲類的特定實例,所以可以說:

Foo x = new Foo(); 
Foo y = new Foo(); 
// Locks method f of instance x, but NOT for y. 
x.f(); 

在靜態情況下到F(呼叫)將鎖定兩個版本,所以只有一個方法調用到f將在被執行一次。

+0

它不會「鎖定靜態方法調用」,它會鎖定「.class」對象。 –