Java には偽のウェイクアップは存在しますか?
Java の「偽のウェイクアップ」の概念は多くの議論を引き起こし、その概念に疑問を抱く人もいます。
偽のウェイクアップの原因は何ですか?
偽のウェイクアップには、定義上、明らかなトリガーがありませんが、考えられる原因の 1 つは、特に Linux でのシステム信号です。 Wikipedia の記事で説明されているように、Linux で futex システム コールを使用した pthread_cond_wait() を実装すると、プロセスがシグナルを受信したときに誤ったウェイクアップが発生する可能性があります。各ブロッキング システム コールはシグナルの EINTR で返されるため、futex 呼び出しの外側で pthread_cond_wait() が本物のウェイクアップを見逃す可能性があります。この競合状態を回避するには、呼び出し元は不変条件をチェックする必要があります。その結果、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 中国語 Web サイトの他の関連記事を参照してください。