2014-04-22 64 views
1

我的理解是,當一個對象方法是'synchronized'時,那麼只能在該方法中一次只允許一個線程。我測試了它,它工作。在Java中,當對象中的一個方法是'synchronized'時,所有方法都'synchronized'嗎?

但是我最近被告知,線程必須獲得控制來訪問同步方法的「鎖定」是「對象鎖定」。意思是對象的所有方法(同步或不同步)都以同步的方式有效地運行。

我測試了一下,用synchronized void method1();void method2();,看來許多線程能夠同時輸入method2

這個人指的是什麼「對象鎖定」,它是如何工作的?

+0

你說得對。此示例中method2未同步。 –

回答

8

他的意思是說,如果你有兩個同步方法,它們將會彼此同步,而不是單獨進行。這是因爲在調用方法的實例上保留了對象鎖。

換句話說,如果你有兩個同步方法foo()bar(),沒有線程可以調用bar()而另一個線程正在調用foo()

如果寫出定義,很容易看出。同步方法

public synchronized void foo() { 
    stuff; 
} 

相當於:

public void foo() { 
    synchronized(this) { 
    stuff; 
    } 
} 

對於沒有關聯的實例(即,靜態方法)方法,一個鎖被保持在類實例,而不是。

+0

因此,如果您在同一個對象上有兩個同步方法,則只能同時運行一個運行(不是每個運行中的一個)。 – Thilo

+0

是的,這是正確的。 –

相關問題