Java 同步中的假喚醒概念已經成為討論的主題相當長一段時間了。雖然這種行為的可能性存在,但問題仍然存在:它們在實踐中真的發生嗎?
根據 Wikipedia 關於虛假喚醒的文章,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 程式中引起虛假>引發虛假喚醒
<code class="bash">kill -s SIGUSR1 <PID of Java process></code>
效能優勢
雖然虛假喚醒在某些情況下可能被認為是一種煩惱,但它們在現代作業系統中通常很少發生。然而,它們確實在系統效能最佳化中發揮了作用,透過防止不必要的繁忙等待並減少處理等待相同條件變數的多個執行緒時的開銷。以上是Java 中真的會發生虛假喚醒嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!