2012-06-24 51 views
2

我有一個同步的方法和一個類中的非同步方法,並且我有一個線程可以獲得同步方法的鎖定。當sync'd方法被鎖定時訪問類的非sync'd方法

我的問題是這樣的:其他線程可以在這種情況下訪問類的非同步方法嗎?

+0

只有必須持有鎖的代碼纔會一次運行一個線程。不管鎖是否鎖定,都可以運行的代碼可以在沒有鎖的情況下運行。 –

回答

4

是的。如果沒有聲明​​

+1

但是有些線程已經將鎖定在那個對象上,那麼它怎麼可能讓其他線程進入該鎖定的對象 – Bharath

+0

不,它使用鎖來訪問該方法。如果任何其他線程試圖重用相同的鎖,它會卡住並等待另一個線程完成 – GETah

+0

,但是您說如果其他線程未聲明同步方法,該方法仍可訪問? – Bharath

1

的方法仍然是其他線程訪問一個同步的方法是僅適用於使用當前實例作爲顯示器(鎖)同步塊句法快捷方式:

public synchronized void abc() { 
    //something to do 
} 

相當於

public void abc() { 
    synchronized(this) { 
     //something to do 
    } 
} 

要運行同步的塊,線程必須首先獲取相應的顯示器,在這種情況下this,這保證了不超過一個線程可以在同一時間運行該塊。

現在,this被用作監視器的事實不能保證在同步塊之外的任何東西。換句話說,如果你的對象包含非同步方法,它們可以由多個線程同時運行,因爲它們不需要運行線程獲取監視器。

2

是的,其他線程可以訪問非同步方法,但是請記住其他線程無法訪問其他同步方法,因爲每個對象只有一個鎖而不是每個方法。