当我以静态方式同步块调用wait()时,为什么Java会抛出java.lang.IllegalMonitorStateException?

时间:2014-01-15 22:00:17

标签: java multithreading concurrency

我不明白为什么Java会在此代码中抛出来自subject的异常。有人可以解释一下吗?

class Wait implements Runnable
{
    public void run() {
        synchronized (Object.class) {
            try {
                while(true) {
                    System.out.println("Before wait()");
                    wait();
                    System.out.println("After wait()");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class ObjectMethodInConcurency 
{
    public static void main(String[] args) {
        Wait w = new Wait();
        (new Thread(w)).start();
    }
}

1 个答案:

答案 0 :(得分:16)

在班级中使用 synchronized(this){代替 synchronized(Object.class)

编辑

上述代码中IllegalMonitorException背后的推理

在Java中使用synchronized关键字是一种创建和获取监视器对象的方法,该监视器对象将用作执行相应代码块的锁。

在上面的代码中,监视器是“Object.class”。

而wait()方法告诉当前线程等待它被通知,你必须在拥有该锁的监视器对象上调用wait()。

因此调用wait()方法的方式如下所示,否则您将获得IllegalMonitorException。

synchronized(monitor){
    monitor.wait();
}

因此,对于您的示例,您可以使用"Object.class.wait()"或将监视器更改为this,因为您在当前实例上调用了wait()方法