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中文网其他相关文章!