Java 线程等待方法需要同步为什么?
可能重复:Java 线程等待方法需要同步为什么?,java,multithreading,Java,Multithreading,可能重复: 我注意到,threadwait()方法需要在同步代码块或同步方法中调用。没有这一点,它就是投掷 java.lang.IllegalMonitorStateException 。为什么?请参考javadoc中的Object.wait () “当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。”From 为什么这个版本的g
我注意到,threadwait()方法需要在同步代码块或同步方法中调用。没有这一点,它就是投掷
java.lang.IllegalMonitorStateException
。为什么?请参考javadoc中的Object.wait () “当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。”From 为什么这个版本的guardedJoy是同步的?假设d是我们用来调用wait的对象。当线程调用d.wait时,它必须拥有d的内部锁-否则会引发错误。在同步方法中调用wait是获取内部锁的一种简单方法 您遇到的错误就是他们在示例中引用的错误。@synchronized(Obj){…}类似于:
SynchronizedObject.lock()…SynchronizedObject.Unlock() 等待基本上是:
SynchronizedObject.Unlock()&SynchronizedObject.Lock()
这在我看来更清楚了……您需要有锁才能释放它您可能正在寻找
Thread.sleep()
public synchronized guardedJoy() {
// This guard only loops once for each special event, which may not
// be the event we're waiting for.
while(!joy) {
try {
wait();
} catch (InterruptedException e) {}
}
System.out.println("Joy and efficiency have been achieved!");
}