我对线程类的wait()方法感到困惑。众所周知,wait()方法总是从同步上下文中调用。但是在执行wait方法之后,该线程是否会释放它所持有的对象的锁定。
我的意思是要求“当一个线程进入一个对象的等待池时,在它开始之前会释放它所拥有的锁。”
答案 0 :(得分:1)
是肯定的。它在javadoc中清楚地说明了: 等待
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait()
public final void wait() 抛出InterruptedException
导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法。换句话说,此方法的行为就像它只是执行调用wait(0)一样。 当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后该线程等待,直到它可以重新获得监视器的所有权并继续执行。
此方法只能由作为此对象监视器所有者的线程调用。有关线程可以成为监视器所有者的方式的说明,请参阅notify方法。
抛出: IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。 InterruptedException - 如果另一个线程已中断当前线程。抛出此异常时,将清除当前线程的中断状态。 也可以看看: notify(),notifyAll()
答案 1 :(得分:0)
http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#wait()
导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法。
回答你的第二个问题:从不。正如你在上一个问题中所做的那样,锁定不会被任意释放 - 这会破坏同步。
Oracle提供了一个相当详细的教程,涵盖了所有这些信息:
http://download.oracle.com/javase/tutorial/essential/concurrency/