2011-11-19 225 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