IllegalMonitorStateException异常表示:
当前线程不是对象锁的持有者,即调用wait方法或者notify的对象不在synchronized的括号里面,调用看如下代码:
public class Test {
public static void main(String[] args) {
Integer i = 0;
MyThread10 m = new MyThread10(i);
m.start();
}
}
class MyThread10 extends Thread {
Integer i;
public MyThread10(Integer i) {
this.i = i;
}
public void run() {
synchronized(i) {
i++;
try {
i.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
包装类对象i作为对象锁,但++之后会重新生成一个对象,导致synchronized里的i在执行i++之后不是同一个对象了(可以将i++看成一个新对象),而再调用i.wait()或者i.notifyAll()就会抛异常,因为新生成的i不属于该线程所持有。
根本原因是因为Integer中的value是final类型的,不能被修改,所以在执行++操作时,生成的是另一个对象。