- 如果调用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();
}