何时抛出IllegalMonitorSttateException?

时间:2015-06-16 17:12:49

标签: multithreading object exception illegalmonitorstateexcep

Object.wait(),Object.notify(),Object.notifyAll()方法抛出IllegalMonitorStateException。如果当前线程不是此对象的监视器的所有者,则抛出此异常。但是,如果没有得到对象的监视器天气当前线程就能在任何对象上执行wait / notify / notifyAll而没有明白这一点? O / W非法监视器状态的可能性是多少?

感谢scottb提出建议。感谢Henno的回复。我得到的另一个疑问是成为对象监视器的拥有者:

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

理解前两个陈述。但类型类对象的基础是什么?

1 个答案:

答案 0 :(得分:2)

如您所述,当前线程不是此对象监视器(即锁定监视器)的所有者时,抛出IllegalMonitorStateException。这意味着当前线程必须在同步代码块中调用wait或notify,如:

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

如果你只做

object.wait();

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

如果在没有锁定监视器的情况下锁定另一个对象,它也会被抛出:

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