0
点赞
收藏
分享

微信扫一扫

记录一个关于包装类调用wait方法或者notify方法会报java.lang.IllegalMonitorStateException异常

穿裙子的程序员 2022-02-17 阅读 73

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类型的,不能被修改,所以在执行++操作时,生成的是另一个对象。

举报

相关推荐

0 条评论