• 如果调用wait()方法的线程没有事先获取该对象的监视器锁,则调用wait()方法时调用线程会抛出IllegalMonitorStateException异常。
  • 源码
/** * 抛出该异常指示线程试图在对象的监视器上等待, * 或者通知其他线程在对象的监视器上等待而没有拥有指定的监视器。 */
public
class IllegalMonitorStateException extends RuntimeException {
   
    private static final long serialVersionUID = 3713306369498869069L;
    
    public IllegalMonitorStateException() {
   
        super();
    }

    public IllegalMonitorStateException(String s) {
   
        super(s);
    }
}

  • 例如(错误示范)
public static void main(String arg[]) throws InterruptedException{
   
       Object obj = new Object();
       obj.wait();
} 

异常信息:
Exception in thread "main" java.lang.IllegalMonitorStateException
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:502)
	at test02.Main.main(Main.java:16)

  • 那么一个线程如何才能获取一个共享变量的监视器锁呢?
    1.执行synchronized同步代码块时,使用该共享变量作为参数。
    synchronized(共享变量){
    // 当前锁对象为 共享变量
       共享变量.wait();
    }

2.调用该共享变量的方法,并且该方法使用了synchronized修饰。

   public synchronized void month(){
    // 当前锁对象为this
       this.wait();
   }

  public static synchronized void month(){
    // 当前锁对象为当前类.class
      当前类.class.wait();
  }