Object.wait(),Object.notify(),Object.notifyAll()方法抛出IllegalMonitorStateException。如果当前线程不是此对象的监视器的所有者,则抛出此异常。但是,如果没有得到对象的监视器天气当前线程就能在任何对象上执行wait / notify / notifyAll而没有明白这一点? O / W非法监视器状态的可能性是多少?
感谢scottb提出建议。感谢Henno的回复。我得到的另一个疑问是成为对象监视器的拥有者:
线程通过以下方式之一成为对象监视器的所有者: •通过执行该对象的同步实例方法。 •通过执行在对象上同步的同步语句的主体。 •对于Class类型的对象,通过执行该类的同步静态方法。
理解前两个陈述。但类型类对象的基础是什么?
答案 0 :(得分:2)
如您所述,当前线程不是此对象监视器(即锁定监视器)的所有者时,抛出IllegalMonitorStateException。这意味着当前线程必须在同步代码块中调用wait或notify,如:
synchronized(object) {
object.wait();
}
如果你只做
object.wait();
抛出IllegalMonitorStateException,因为当前线程没有使用synchronized获得对象的锁定。
如果在没有锁定监视器的情况下锁定另一个对象,它也会被抛出:
synchronized(object) {
someOtherObject.wait();
}