2011-11-19 114 views
0

我對線程類的wait()方法感到困惑。已知wait()方法總是從同步的上下文中調用。但是在等待方法執行之後,該線程是否會釋放它所持有的那個對象的鎖。等待方法混淆

我的意思是要求「當一個線程去等待一個對象池時,在去之前它會釋放它所擁有的鎖。」

回答

1

是的。它相當清楚的Javadoc指出: 等待

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait()

公衆最終無效的wait() 拋出InterruptedException的

導致當前的線程等待,直到另一個線程調用notify()方法或此對象的notifyAll()方法。換句話說,這個方法的行爲就好像它只是執行呼叫等待(0)一樣。 當前線程必須擁有該對象的監視器。線程釋放此監視器的所有權,並等待另一個線程通知對通知方法或notifyAll方法的調用,以便通知通過此對象監視器等待的線程喚醒。該線程然後等待,直到它可以重新獲得監視器的所有權並恢復執行。

此方法只能由作爲此對象監視器所有者的線程調用。有關線程可以成爲監視器所有者的方式的說明,請參閱notify方法。

拋出: IllegalMonitorStateException - 如果當前線程不是對象監視器的所有者。 InterruptedException - 如果另一個線程中斷了當前線程。拋出此異常時,當前線程的中斷狀態將被清除。 另請參見: 通知(),notifyAll的()

+0

感謝。還有一件事,我們是否必須在等待被調用的同一個對象上調用notify()方法。 – aj983

+0

是的,因爲該對象擁有顯示器 –

0

http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#wait()

導致當前的線程等待,直到其他線程調用此對象的通知()方法或notifyAll()方法。

並回答你的第二個問題:從來沒有。就像在你最後一個問題中一樣,鎖永遠不會被任意釋放 - 這會破壞同步。

Oracle提供了一個非常詳細的教程,涵蓋所有的這樣的信息:

http://download.oracle.com/javase/tutorial/essential/concurrency/

+0

謝謝。還有一件事,我們是否必須在等待被調用的同一個對象上調用notify()方法。 – aj983