> Java > java지도 시간 > Java에서 `wait()`를 사용할 때 IllegalMonitorStateException이 발생하는 이유는 무엇입니까?

Java에서 `wait()`를 사용할 때 IllegalMonitorStateException이 발생하는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-03 02:49:09
원래의
764명이 탐색했습니다.

Why Do I Get an IllegalMonitorStateException When Using `wait()` in Java?

스레드 대기 중 IllegalMonitorStateException 극복

Java의 멀티스레딩은 작업의 동시 실행을 위한 강력한 메커니즘을 제공합니다. 그러나 때때로 개발자가 wait() 메서드를 사용하려고 할 때 "IllegalMonitorStateException" 오류가 발생합니다. 이 오류는 스레드가 잠금을 유지하지 않고 개체를 기다리려고 할 때 발생합니다.

해결책

IllegalMonitorStateException을 방지하려면 현재 스레드가 기다리려는 개체를 잠급니다. 동기화된 블록 내에서 wait() 호출을 캡슐화하면 이를 달성할 수 있습니다.

synchronized (object) {
    object.wait();
}
로그인 후 복사

wait()를 호출하기 전에 객체에 대한 잠금을 획득하면 본질적으로 다음과 같은 경우 알림을 받을 스레드를 등록하게 됩니다. 객체의 상태가 변경됩니다. 잠금을 보유하지 않으면 스레드는 객체를 기다릴 수 있는 권한이 없습니다.

동시성 패키지에 대한 고려 사항

Java 5는 wait()와 같은 이전 메커니즘에 비해 스레드 동기화를 위한 더욱 강력하고 사용자 친화적인 옵션을 제공합니다. 이러한 패키지는 더 많은 제어와 유연성을 제공하는 ReentrantLock 및 CountDownLatch와 같은 클래스를 제공합니다. 예를 들어 대기 조건을 보호하기 위해 ReentrantLock을 사용하는 것은 다음과 같습니다.

ReentrantLock lock = new ReentrantLock();

void waitMethod() {
    lock.lock(); // Acquire lock
    try {
        lock.wait(); // Wait while holding lock
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock(); // Release lock
    }
}

void notifyMethod() {
    lock.lock(); // Acquire lock
    try {
        lock.notify(); // Notify waiting thread
    } finally {
        lock.unlock(); // Release lock
    }
}
로그인 후 복사

동시성 패키지를 사용하면 동기화가 올바르게 처리되도록 보장하면서 스레딩 코드를 단순화하여 다음과 같은 오류가 발생할 가능성을 줄일 수 있습니다. IllegalMonitorStateException.

위 내용은 Java에서 `wait()`를 사용할 때 IllegalMonitorStateException이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿