等待方法混乱

时间:2011-11-19 04:00:27

标签: java

我对线程类的wait()方法感到困惑。众所周知,wait()方法总是从同步上下文中调用。但是在执行wait方法之后,该线程是否会释放它所持有的对象的锁定。

我的意思是要求“当一个线程进入一个对象的等待池时,在它开始之前会释放它所拥有的锁。”

2 个答案:

答案 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/

相关问题