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

标签 java multithreading concurrency

我不明白为什么 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/

相关文章:

java - 使用synchronized方法和 block 解决Java线程中的计数器问题

objective-c - NSMutableArray + NSEnumeration并发内存错误

java - 在事件调度线程中显示 JWindow

c++ - Microsoft 并行模式库 (PPL) 与 OpenMP

java - NoSuchMethodError : com. amazonaws.services.s3.model.S3ObjectInputStream.readAllBytes()

java - 从 json recycleview Retrofit2 获取 id

java - 这个等待通知线程语义的真正目的是什么?

go - 解决 goroutines 死锁

java - 确定一个方法是否在运行时覆盖另一个

java - 如何计算 zip 文件中的特定文件数