我不明白为什么 Java 会在这段代码中从主题中抛出异常。有人能给我解释一下吗?
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();
}
}
最佳答案
在你的类中使用synchronized (this) {而不是synchronized (Object.class)
编辑
上述代码中IllegalMonitorException背后的原因
在 Java 中使用 synchronized 关键字是一种创建和获取监视器对象的方法,该对象将用作执行相应代码块的锁。
在上面的代码中,监视器是“Object.class”。
wait() 方法告诉当前线程等待,直到它收到通知,您必须在拥有锁的监视器对象上调用 wait()。
所以调用 wait() 方法的方法如下所示,否则你将得到 IllegalMonitorException。
synchronized(monitor){
monitor.wait();
}
因此对于您的示例,您可以使用 "Object.class.wait()"
或将监视器更改为 this
,因为您正在调用 wait()
当前实例的方法
关于java - 当我以静态方式同步块(synchronized block)调用 wait() 时,为什么 Java 抛出 java.lang.IllegalMonitorStateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21149139/