首页  >  文章  >  Java  >  使用Java的wait()和notify()时如何避免IllegalMonitorStateException?

使用Java的wait()和notify()时如何避免IllegalMonitorStateException?

Barbara Streisand
Barbara Streisand原创
2024-11-02 10:13:30449浏览

How Do You Avoid IllegalMonitorStateException When Using Java's wait() and notify()?

Java 等待和通知:了解 IllegalMonitorStateException

Java 中,wait() 和 notify() 方法用于同步线程。但是,如果使用不当,可能会遇到 IllegalMonitorStateException。

问题

下面的代码片段演示了一个简单的同步问题:

<code class="java">class Main {
    // ...
    public void wait() {
        // ...
    }
    public void notifyAll() {
        // ...
    }
}

class Runner implements Runnable {
    public void run() {
        try {
            Main.main.wait();
        } catch (InterruptedException e) {
            // ...
        }
    }
}</code>

在此示例中,Runner 线程尝试在 Main 对象上调用 wait()。然而,这会导致异常,因为 Runner 线程不拥有与 Main 对象关联的监视器。

理解同步方法

使用 wait() 和 notification (),当前线程必须拥有正在同步的对象的监视器。这可以通过使用synchronized关键字在对象上进行同步来实现。

解决方案

要解决此问题,可以按如下方式修改 Runner 类:

<code class="java">class Runner implements Runnable {
    public void run() {
        try {
            synchronized(Main.main) {
                Main.main.wait();
            }
        } catch (InterruptedException e) {
            // ...
        }
    }
}</code>

通过在 wait() 调用周围添加同步块,Runner 线程成为 Main 对象监视器的所有者,并且可以安全地执行等待操作。

应用于 notificationAll

同样的原理也适用于notify()和notifyAll()方法。必须从正在同步的对象的同步块内调用它们。因此,Main类可以修改如下:

<code class="java">class Main {
    // ...
    public synchronized void notifyAll() {
        // ...
    }
}</code>

通过确保监视器的正确所有权,可以安全地使用wait()和notify()来实现Java中的线程同步。

以上是使用Java的wait()和notify()时如何避免IllegalMonitorStateException?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn