0

Object.wait()、Object.notify()、Object.notifyAll() 方法抛出 IllegalMonitorStateException。如果当前线程不是此对象监视器的所有者,则会引发此异常。但是,如果没有得到对象的监视器天气当前线程将能够在任何对象上执行等待/通知/通知全部,就不清楚了吗?O/w 非法监视器状态的机会是什么?

感谢 scottb 的建议。感谢海诺的回复。我得到的另一个疑问是关于成为对象监视器的所有者:

线程通过以下方式之一成为对象监视器的所有者: • 通过执行该对象的同步实例方法。• 通过执行在对象上同步的同步语句的主体。• 对于Class 类型的对象,通过执行该类的同步静态方法。

前两个陈述被理解。但是 class 类型的对象的基本原理是什么?

4

1 回答 1

2

正如您所提到的,当当前线程不是该对象的监视器(即锁监视器)的所有者时,将引发 IllegalMonitorStateException。这意味着当前线程必须从同步代码块中调用等待或通知,例如:

synchronized(object) {
    object.wait();
}

如果你只做

object.wait();

抛出 IllegalMonitorStateException 是因为当前线程没有使用 synchronized 获得对象的锁。

如果您锁定另一个对象而没有对该对象的锁定监视器,它也会被抛出:

synchronized(object) {
    someOtherObject.wait();
}
于 2015-06-16T17:29:29.173 回答