Home >Java >javaTutorial >Are Spurious Wakeups in Java a Myth?
Do Spurious Wakeups in Java Exist?
The concept of "spurious wakeups" in Java has sparked numerous discussions, leading some to question their actual occurrence.
What Causes Spurious Wakeups?
Spurious wakeups by definition lack obvious triggers, but one possible cause is system signals, particularly under Linux. As the Wikipedia article explains, Linux's implementation of pthread_cond_wait() using the futex system call can result in a spurious wakeup when a process receives a signal. Since each blocking system call returns with EINTR on a signal, it's possible for pthread_cond_wait() to miss a genuine wakeup while outside the futex call. To avoid this race condition, the caller must check for an invariant. Consequently, any POSIX signal can induce a spurious wakeup.
Example
Consider the following code:
<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>
In this scenario, a spurious wakeup can be simulated by sending a signal to the process, causing its waiting thread to experience a premature awakening.
The above is the detailed content of Are Spurious Wakeups in Java a Myth?. For more information, please follow other related articles on the PHP Chinese website!