Java.Lang.IllegalMonitorStateException

Sheeraz Gul 2023년10월12일
Java.Lang.IllegalMonitorStateException

IllegalMonitorStateException은 멀티스레딩 프로그래밍과 관련이 있습니다. 이 튜토리얼은 Java의 IllegalMonitorStateException을 설명하고 시연합니다.

Java의 java.lang.IllegalMonitorStateException

IllegalMonitorStateException은 Java에서 다중 스레딩 프로그래밍으로 작업할 때 발생합니다. 모니터에서 동기화하고 스레드가 해당 시간을 소유하지 않고 모니터에서 대기 중인 다른 스레드를 기다리거나 알리려고 하면 IllegalMonitorStateException이 발생합니다.

synchronized 블록에 없는 object 클래스에서 wait(), notify() 또는 notifyAll() 메서드를 호출하면 이 예외가 발생합니다. 이 시나리오에서 예를 들어 보겠습니다.

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

위의 코드는 Runnable 클래스를 구현하는 클래스를 생성한 다음 synchronized 블록 외부에서 wait 메소드를 호출합니다. ExampleDemoClass 인스턴스에서 스레드를 생성합니다.

wait 메서드가 synchronized 블록 외부에서 호출되고 wait() 메서드를 호출하기 전에 스레드가 모니터에 대한 잠금을 소유해야 하기 때문에 IllegalMonitorStateException이 발생합니다. 출력 참조:

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)

이 예외를 수정하려면 object 잠금을 획득한 후 wait(), notify() 또는 notifyAll() 메서드를 호출해야 합니다. 이 잠금은 synchronized 블록에 있게 됩니다.

이제 wait() 메서드를 synchronized 블록에 넣은 다음 위의 코드를 오류 없이 만듭니다. 예를 참조하십시오:

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

이제 wait() 메서드가 synchronized 블록 안에 있고 개체 모니터에 대한 잠금이 획득되면 코드가 성공적으로 실행됩니다. 출력 참조:

Thread can successfully run.
작가: Sheeraz Gul
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

관련 문장 - Java Exception