我不明白为什么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();
}
}
答案 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()
方法