快捷搜索: 王者荣耀 脱发

关于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();
    } 
 }
}
经验分享 程序员 微信小程序 职场和发展