我有一個同步的方法和一個類中的非同步方法,並且我有一個線程可以獲得同步方法的鎖定。當sync'd方法被鎖定時訪問類的非sync'd方法
我的問題是這樣的:其他線程可以在這種情況下訪問類的非同步方法嗎?
我有一個同步的方法和一個類中的非同步方法,並且我有一個線程可以獲得同步方法的鎖定。當sync'd方法被鎖定時訪問類的非sync'd方法
我的問題是這樣的:其他線程可以在這種情況下訪問類的非同步方法嗎?
的方法仍然是其他線程訪問一個同步的方法是僅適用於使用當前實例作爲顯示器(鎖)同步塊句法快捷方式:
public synchronized void abc() {
//something to do
}
相當於
public void abc() {
synchronized(this) {
//something to do
}
}
要運行同步的塊,線程必須首先獲取相應的顯示器,在這種情況下this
,這保證了不超過一個線程可以在同一時間運行該塊。
現在,this
被用作監視器的事實不能保證在同步塊之外的任何東西。換句話說,如果你的對象包含非同步方法,它們可以由多個線程同時運行,因爲它們不需要運行線程獲取監視器。
是的,其他線程可以訪問非同步方法,但是請記住其他線程無法訪問其他同步方法,因爲每個對象只有一個鎖而不是每個方法。
只有必須持有鎖的代碼纔會一次運行一個線程。不管鎖是否鎖定,都可以運行的代碼可以在沒有鎖的情況下運行。 –