迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 异常 Java.Lang.IllegalMonitorStateException

作者:迹忆客 最近更新:2023/07/16 浏览次数:

IllegalMonitorStateException 与多线程编程有关。 本篇文章描述并演示了 Java 中的 IllegalMonitorStateException。


Java 中的 java.lang.IllegalMonitorStateException

在 Java 中使用多线程编程时会发生 IllegalMonitorStateException。 当我们在监视器上进行同步时,一个线程尝试等待或通知在该监视器上等待的其他线程,但此时不拥有该监视器,则会发生 IllegalMonitorStateException。

如果我们从不在同步块中的对象类中调用方法 wait()notify()notifyAll(),则会抛出此异常。 让我们在这个场景中尝试一个例子。

package jiyik;

class DemoClass implements Runnable {
    public void run() {
        try {
            // The wait method is called outside the synchronized block
            this.wait(100);
            System.out.println("Thread can successfully run.");
        }
        catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

public class Example {
    public static void main(String[] args) {
        DemoClass DemoRunnable = new DemoClass();
        Thread DemoThread = new Thread(DemoRunnable);
        DemoThread.start();
    }
}

上面的代码创建了一个实现 Runnable 类的类,然后在同步块之外调用 wait 方法。 该示例从 DemoClass 的实例创建一个线程。

它将抛出 IllegalMonitorStateException,因为 wait 方法是在同步块之外调用的,并且在调用 wait() 方法之前线程必须拥有监视器上的锁。 查看输出:

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException: current thread is not owner
    at java.base/java.lang.Object.wait(Native Method)
    at jiyik.DemoClass.run(Example.java:7)
    at java.base/java.lang.Thread.run(Thread.java:833)

要修复此异常,我们必须在获取对象锁后调用 wait()notify()notifyAll() 方法,这些方法将位于同步块中。

现在让我们将 wait() 方法放入同步块中,然后使上面的代码不会出错。 参见示例:

package jiyik;

class DemoClass implements Runnable {
    public void run() {
        synchronized (this) {
            try {
                // The wait method is called outside the synchronized block
                this.wait(100);
                System.out.println("Thread can successfully run.");
            }
            catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
}

public class Example {
    public static void main(String[] args) {
        DemoClass DemoRunnable = new DemoClass();
        Thread DemoThread = new Thread(DemoRunnable);
        DemoThread.start();
    }
}

现在 wait() 方法位于同步块内,并且获取了对象监视器上的锁,代码将成功运行。 查看输出:

Thread can successfully run.

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Java 异常 Java.IO.StreamCorruptedException: Invalid Stream Header

发布时间:2023/07/16 浏览次数:165 分类:Java

本文介绍如何修复Java的 java.io.StreamCorruptedException: invalid stream header 异常。Java 中的 java.io.StreamCorruptedException: invalid stream header java.io.StreamCorruptedException: invalid stream header 是相对常见的异常。

Java 异常 Java.IO.IOException: Connection Reset by Peer

发布时间:2023/07/16 浏览次数:177 分类:Java

本篇文章介绍 Java 的 java.io.IOException: Connection reset by peer。Java 中 java.io.IOException: Connection reset by peer IOException 表示读取或写入文件或访问文件系统时可能发生的任何输入输出异常。

Java 异常 java.lang.AbstractMethodError

发布时间:2023/07/14 浏览次数:112 分类:Java

本文将帮助您了解 java.lang.AbstractMethodError 以及如何在 Java 中解决它们。修复 Java 中的 java.lang.AbstractMethodError 错误 有时,我们的程序在运行时可能会遇到 AbstractMethodError。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便