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 중국어 웹사이트의 기타 관련 기사를 참조하세요!