IllegalMonitorStateException - if the current thread is not the owner of the object's monitor.
根据官方注释解释,“当前线程不是对象管理者的所有者”。下面有两个例子:
1. 慎用Integer等数字类型做为共享资源
public class Demo2 extends Thread{
Integer n;
public Demo2(Integer n){
this.n = n;
}
public void run(){
synchronized (n) {
try {
n.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
Integer n = 1;
Demo2 demo2 = new Demo2(n);
demo2.start();
Thread.sleep(200);
synchronized (n) {
n ++; <span style="color:#FF0000;">//这里n++执行完毕,本身已经之前的对象了,等于 new Integer(n)+1</span>
n.notify();
}
}
}
会报异常:
Exception in thread "main" java.lang.IllegalMonitorStateException
因为n++执行完毕,早已不是当初的那个n
2. synchronize()与wait()、notify() 指定的不是同一对象
public synchronize void func(){
list.wait(); // or list.notify(); 都会导致IllegalMonitorStateException异常
}
synchronize对象是类对象,wait/notify对象是list