Le concept de réveils parasites dans la synchronisation Java est un sujet de discussion depuis un certain temps. Bien que le potentiel d'un tel comportement existe, la question demeure : se produisent-ils réellement dans la pratique ?
Selon l'article de Wikipédia sur les réveils parasites, l'implémentation Linux du pthread_cond_wait( ) la fonction utilise l'appel système futex. Lorsqu'un processus reçoit un signal, il peut revenir brusquement avec EINTR, provoquant la fin prématurée de ses appels système bloquants.
Cette condition de concurrence survient car pthread_cond_wait() ne peut pas reprendre le thread en attente s'il a manqué un véritable réveil lors de l'exécution en dehors de l'appel système futex. En conséquence, un signal POSIX peut déclencher un réveil parasite.
Le programme Java fourni démontre le concept :
<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>
Pour provoquer un réveil parasite dans ce programme Java, un signal peut être envoyé au processus pendant qu'il attend la condition. Ceci peut être réalisé sous Linux à l'aide d'une commande telle que :
<code class="bash">kill -s SIGUSR1 <PID of Java process></code>
Bien que les réveils parasites puissent être considérés comme une gêne dans certains scénarios, leur apparition est généralement rare dans les systèmes d'exploitation modernes. Ils jouent cependant un rôle dans l'optimisation des performances du système en évitant les attentes inutiles et en réduisant les frais généraux lors du traitement de plusieurs threads en attente sur la même variable de condition.
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!