Java 同期におけるスプリアス ウェイクアップの概念は、かなり長い間議論の対象となってきました。このような動作の可能性は存在しますが、疑問は残ります: 実際に実際に発生するのでしょうか?
偽のウェイクアップに関する Wikipedia の記事によると、Linux での pthread_cond_wait( ) 関数は futex システムコールを利用します。プロセスがシグナルを受信すると、突然 EINTR で戻り、ブロッキング システム コールが早期に終了することがあります。
この競合状態は、pthread_cond_wait() がプロセスを再開できないために発生します。 futex システムコールの外で実行中に実際のウェイクアップを逃した場合にスレッドを待機します。その結果、POSIX 信号が偽のウェイクアップをトリガーする可能性があります。
提供されている Java プログラムは次の概念を示しています。
<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 プログラムで偽のウェイクアップを誘発するには、条件を待機しているプロセスにシグナルを送信できます。これは、Linux で次のようなコマンドを使用して実現できます。
<code class="bash">kill -s SIGUSR1 <PID of Java process></code>
シナリオによっては、偽のウェイクアップが迷惑とみなされる場合もありますが、最新のオペレーティング システムでは通常、その発生はまれです。ただし、同じ条件変数を待機している複数のスレッドを処理するときに、不必要なビジー待機を防止し、オーバーヘッドを削減することで、システムのパフォーマンスの最適化に役割を果たします。
以上がJava での偽のウェイクアップは本当に発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。