可能重复:
为什么等待应该总是在同步块中
我注意到,线程 wait() 方法需要在同步代码块或同步方法中调用。没有它,它正在抛出
java.lang.IllegalMonitorStateException
. 为什么?
可能重复:
为什么等待应该总是在同步块中
我注意到,线程 wait() 方法需要在同步代码块或同步方法中调用。没有它,它正在抛出
java.lang.IllegalMonitorStateException
. 为什么?
来自Java 教程
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!");
}
为什么这个版本的guardedJoy 是同步的?假设 d 是我们用来调用等待的对象。当线程调用 d.wait 时,它必须拥有 d 的内在锁——否则会抛出错误。在同步方法中调用 wait 是获取内在锁的一种简单方法。
您遇到的错误是他们在示例中引用的错误。
请参阅 Object.wait 的 javadoc。
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait ()
“当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。然后线程等待直到它可以重新获得监视器的所有权并恢复执行。”
@synchronized(Obj) {...} 就像:
SynchronizedObject.lock() ... SynchronizedObject.Unlock()
等待基本上是:
SynchronizedObject.Unlock() & SynchronizedObject.Lock()
这使得 IMO 更清楚......你需要有锁才能释放它