IllegalMonitorStateException — 모니터를 소유하지 않고 동기화 시도

IllegalMonitorStateException — 모니터를 소유하지 않고 동기화 시도

IllegalMonitorStateException은 스레드가 특정 객체의 모니터(monitor)를 소유하지 않은 상태에서 그 모니터에 대해 wait()를 호출하거나, 다른 스레드를 notify()·notifyAll()로 깨우려 했을 때 던져지는 예외예요.

출처: Java API Reference

본문

자바의 synchronized 블록이나 synchronized 메서드 안에서만 Object.wait(), Object.notify(), Object.notifyAll()을 부를 수 있어요. 이들을 동기화 블록 밖에서 호출하면 JVM은 이 예외를 던져요. "지금 이 객체의 lock을 내가 안 갖고 있는데 왜 wait/notify를 불러?"라는 신호죠.

상속 구조는 다음과 같아요.

java.lang.Object
  java.lang.Throwable
    java.lang.Exception
      java.lang.RuntimeException
        java.lang.IllegalMonitorStateException

생성자

  • IllegalMonitorStateException() — 상세 메시지 없이 생성해요.
  • IllegalMonitorStateException(String s) — 지정된 상세 메시지로 생성해요.

관련 API로는 Object.notify(), Object.notifyAll(), Object.wait() 계열이 있어요. 이 예외가 나오면 대개 "동기화 블록 밖에서 wait/notify를 호출했다"는 코딩 실수를 의심해 보는 게 좋아요.

더 알아보기 (Learn more)