代码如下:
class Test{
public static void get(){
new Thread(){
wait();
System.out.print("hello world!");
};
}
}
在代码中,当因一些原因使用wait()时,抛出IllegalMonitorStateException,查询后发现wait()和notify()方法必须在同步代码块中使用,然后为在方法上使用了synchronized关键字.更改如下:
public static synchronized get(){
.......
wait();
........
}
结果依然抛出IllegalMonitorStateException,接着又去百度,查看API,后来发现原因是:
抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程
从该解释中可以知道:
1.使用该方法的时候必须在同步块(方法中),因为它始终和对象监视器绑定在一起.
2.调用该方法的对象必须是该同步块(方法)监视器的所有者.
以上代码中,wait()方法的调用者是new Thread(){};匿名内部类,而同步方法时静态的,所以监视器所有者是Test.class;如果方法时非静态的,则监视器所有者是Test类的实例对象(this).所以不满足上面第2条,抛出异常. 正确的做法之一是:
public static get(){
Object obj = new Object();
.......
synchronized(obj){
obj.wait();
}
........
}