>Java >java지도 시간 >Java의 가짜 깨우기는 신화입니까?

Java의 가짜 깨우기는 신화입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-03 06:56:30444검색

Are Spurious Wakeups in Java a Myth?

Java에 가짜 웨이크업이 존재합니까?

Java의 "가짜 웨이크업" 개념은 수많은 논의를 불러일으켰고, 일부에서는 Java에 대한 의문을 제기하기도 했습니다.

가짜 깨우기의 원인은 무엇입니까?

의미에 따른 허위 깨우기에는 명확한 트리거가 없지만 가능한 원인 중 하나는 특히 Linux에서 시스템 신호입니다. Wikipedia 기사에 설명되어 있듯이, futex 시스템 호출을 사용하는 Linux의 pthread_cond_wait() 구현은 프로세스가 신호를 수신할 때 가짜 깨우기를 초래할 수 있습니다. 각 차단 시스템 호출은 신호에서 EINTR과 함께 반환되므로 pthread_cond_wait()가 futex 호출 외부에서 실제 깨우기를 놓칠 수 있습니다. 이러한 경합 상태를 방지하려면 호출자가 불변성을 확인해야 합니다. 결과적으로 모든 POSIX 신호는 가짜 절전 모드 해제를 유도할 수 있습니다.

다음 코드를 고려하세요.

<code class="java">public class Spurious {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Condition cond = lock.newCondition();
        lock.lock();
        try {
            try {
                cond.await();
                System.out.println("Spurious wakeup!");
            } catch (InterruptedException ex) {
                System.out.println("Just a regular interrupt.");
            }
        } finally {
            lock.unlock();
        }
    }
}</code>

이 시나리오에서는 가짜 깨우기 웨이크업은 프로세스에 신호를 보내 대기 스레드가 조기 깨우기를 경험하도록 하여 시뮬레이션할 수 있습니다.

위 내용은 Java의 가짜 깨우기는 신화입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.