0

可能重复:
为什么等待应该总是在同步块中

我注意到,线程 wait() 方法需要在同步代码块或同步方法中调用。没有它,它正在抛出

java.lang.IllegalMonitorStateException

. 为什么?

4

3 回答 3

0

来自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 是获取内在锁的一种简单方法。

您遇到的错误是他们在示例中引用的错误。

于 2012-12-05T21:28:49.187 回答
0

请参阅 Object.wait 的 javadoc。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait ()

“当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待的线程唤醒。然后线程等待直到它可以重新获得监视器的所有权并恢复执行。”

于 2012-12-05T21:05:15.760 回答
0

@synchronized(Obj) {...} 就像:
SynchronizedObject.lock() ... SynchronizedObject.Unlock()

等待基本上是:
SynchronizedObject.Unlock() & SynchronizedObject.Lock()

这使得 IMO 更清楚......你需要有锁才能释放它

于 2012-12-05T21:35:55.313 回答