可能重複:
How do synchronized static methods work in Java?Java的靜態同步
有人可以讓我瞭解以下兩個功能之間的根本區別:
public static void synchronized f() {… }
和
public void synchronized f() {… }
可能重複:
How do synchronized static methods work in Java?Java的靜態同步
有人可以讓我瞭解以下兩個功能之間的根本區別:
public static void synchronized f() {… }
和
public void synchronized f() {… }
在「靜態synchnronized」方法中,同步的鎖定在類本身上;在「synchornized」方法中,鎖定在對象上。請注意,這意味着「靜態同步」方法不會被正在運行的「同步」方法阻止,反之亦然。有關詳細信息,請參見:http://geekexplains.blogspot.com/2008/07/synchronization-of-static-and-instance.html
在
public void synchronized f(){...}
同步的情況下是每包圍類的實例。這意味着多個線程可以調用f
對不同的類實例。
對於
public static void synchronized f(){...}
在一個時間只有一個線程可以調用該方法,無論封閉類的實例的數量的。
技術上,通過在第一示例中所採取的顯示器是對象實例和監視器的採取在第二個例子是,Class
對象的。
需要注意的是,如果你有相同名稱的類在不同ClassLoaders
,該不共享同一個顯示器,但是這是你不可能遇到一個細節。
是否有替代Java中的「synchronized」,比如說我們有相同的線程訪問限制,沒有使用「synchronized」關鍵字? – randon
通過使用其中一個['Lock'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock),可以獲得與'synchronized'相同的語義。 html)的實現。 –
我認爲:
public void synchronized f() {… }
同步於對象本身(this
)
public static void synchronized f() {… }
同步上(object.getClass()
或SomeClass.getClass
)的對象的Class
實例
我可以是錯誤
如果它是一個靜態方法,this.getClass()'沒有意義。我認爲你的意思是'SomeClass.class'。 –
@Mark是的,謝謝。我將編輯我的帖子。無論如何,我是否正確? – Thresh
假設方法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將在被執行一次。
它不會「鎖定靜態方法調用」,它會鎖定「.class」對象。 –
@ Oli鏈接中的[第二個答案](http://stackoverflow.com/questions/578904/how-do-synchronized-static-methods-work-in-java/582500#582500)直接回答了這個問題。 –