Java.Lang.IllegalMonitorStateException

Sheeraz Gul 12 Oktober 2023
Java.Lang.IllegalMonitorStateException

Die IllegalMonitorStateException hängt mit der Multithreading-Programmierung zusammen. Dieses Tutorial beschreibt und demonstriert die IllegalMonitorStateException in Java.

die java.lang.IllegalMonitorStateException in Java

Die IllegalMonitorStateException tritt beim Arbeiten mit Multithreading-Programmierung in Java auf. Wenn wir auf einem Monitor synchronisieren und ein Thread versucht zu warten oder die anderen Threads zu benachrichtigen, die auf dem Monitor warten, ohne ihn zu dieser Zeit zu besitzen, tritt die IllegalMonitorStateException auf.

Wenn wir die Methoden wait(), notify() oder notifyAll() aus der object-Klasse aufrufen, die sich nicht im synchronized-Block befindet, wird diese Ausnahme ausgelöst. Lassen Sie uns ein Beispiel in diesem Szenario versuchen.

package delftstack;

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();
  }
}

Der obige Code erstellt eine Klasse, die die Klasse Runnable implementiert und dann die Methode wait ausserhalb des Blocks synchronized aufruft. Das Example erstellt einen Thread aus der Instanz von DemoClass.

Es löst die IllegalMonitorStateException aus, weil die wait-Methode ausserhalb des synchronized-Blocks aufgerufen wird und der Thread eine Sperre auf dem Monitor besitzen muss, bevor wir die wait()-Methode aufrufen. Siehe Ausgabe:

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

Um diese Ausnahme zu beheben, müssen wir die Methoden wait(), notify() oder notifyAll() aufrufen, nachdem die object-Sperre erworben wurde, die sich im synchronized-Block befindet.

Lassen Sie uns nun die Methode wait() in den Block synchronized einfügen und den obigen Code fehlerfrei machen. Siehe Beispiel:

package delftstack;

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();
  }
}

Jetzt befindet sich die wait()-Methode innerhalb des synchronized-Blocks und die Sperre auf dem Objektmonitor wird erworben, der Code wird erfolgreich ausgeführt. Siehe Ausgabe:

Thread can successfully run.
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Verwandter Artikel - Java Exception