Java の擬似ウェイクアップ: 神話か現実?
スレッドが待機状態から予期せずウェイクアップされる擬似ウェイクアップの概念明らかな理由もなく、Java プログラミングの話題になっています。ただし、実際にこれらのイベントが蔓延しているかどうかは疑問視されています。
偽のウェイクアップに関する Wikipedia の記事によると、Java で使用される pthread_cond_wait() の Linux 実装でこの動作が発生します。具体的には、プロセスが受信したシグナルにより、EINTR によるブロック システム コールからの突然の復帰が発生する可能性があります。潜在的な競合状態により、システムは正当なウェイクアップを検出できず、その結果、偽のウェイクアップが発生する可能性があります。
これを説明するには、次の 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>
偽のウェイクアップを人為的に誘発するにはこのコードでウェイクアップするには、ランダム イベントに依存せず、コードを実行しているプロセスにシグナルを送信するだけです。 Linux では、これは kill -CONT
結論として、Linux では pthread_cond_wait() の実装により偽のウェイクアップが発生する理論上の可能性が存在しますが、まともなハードウェア/ソフトウェア環境ではその発生は散発的であるようです。したがって、偽のウェイクアップに関する懸念によって、開発者がロックや条件変数などの適切な同期手法を利用することを思いとどまるべきではありません。
以上がJava における偽のウェイクアップ: 神話か現実か?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。