关于IllegalMonitorStateException异常的解释
首先看一下官方文档的解释:
/** * Thrown to indicate that a thread has attempted to wait on an * objects monitor or to notify other threads waiting on an objects * monitor without owning the specified monitor. * @author unascribed * @see java.lang.Object#notify() * @see java.lang.Object#notifyAll() * @see java.lang.Object#wait() * @see java.lang.Object#wait(long) * @see java.lang.Object#wait(long, int) * @since JDK1.0 */
意思就是说:
抛出该异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器,然而本身没有指定的监视器的线程。
也就是当前的线程不是此对象监视器的所有者。当前线程要锁定该对象之后,才能用锁定的对象执行这些方法,这里需要用到synchronized关键字,锁定哪个对象就用哪个对象来执行notify(), notifyAll(),wait(), wait(long), wait(long, int)操作,否则就会报IllegalMonitorStateException异常。 几个小例子 : 1、锁定方法所属的实例对象:
public synchronized void method(){ //然后就可以调用:this.notify()... //或者直接调用notify()... }
2、锁定方法所属的实例的Class:
public Class Test{ public static synchronized void method(){ //然后调用:Test.class.notify()... } }
3、锁定其他对象:
public Class Test{ public Object lock = new Object(); public static void method(){ synchronized (lock) { //需要调用 lock.notify(); } } }