Les réveils parasites en Java existent-ils ?
Le concept de « réveils parasites » en Java a suscité de nombreuses discussions, amenant certains à remettre en question leur occurrence réelle.
Quelles sont les causes des réveils parasites ?
Les réveils parasites, par définition, manquent de déclencheurs évidents, mais une cause possible réside dans les signaux système, en particulier sous Linux. Comme l'explique l'article de Wikipédia, l'implémentation par Linux de pthread_cond_wait() à l'aide de l'appel système futex peut entraîner un réveil parasite lorsqu'un processus reçoit un signal. Étant donné que chaque appel système bloquant renvoie avec EINTR sur un signal, il est possible que pthread_cond_wait() rate un véritable réveil en dehors de l'appel futex. Pour éviter cette condition de concurrence critique, l'appelant doit rechercher un invariant. Par conséquent, tout signal POSIX peut induire un réveil parasite.
Exemple
Considérez le code suivant :
<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>
Dans ce scénario, un signal parasite le réveil peut être simulé en envoyant un signal au processus, provoquant un réveil prématuré de son thread en attente.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!