2010-12-08 15 views
0

Ce qui suit est une traduction d'une attente atomique en Java. Voici le besoin de while? Est-ce que if n'est pas suffisant?Implémentation d'Atomic wait en Java

///<await (condition) statements; > 

synchronized(obj) 
{ 
     while (!condition) 
     { 
     obj.wait(); 
     } 
     statements; 
} 

Répondre

3

Vous devez le while, parce que juste parce que quelqu'un vous a envoyé un notify ne signifie pas que la condition est maintenant vrai (ou est toujours vrai).

Tout ce que fait (ou est censé faire) est de dire aux threads en attente (dont il peut y avoir beaucoup, avec des conditions différentes à attendre, même sur le même moniteur) qui serait le bon moment pour évaluer s'ils ont encore besoin de wait.

4

Il y a deux raisons pour lesquelles vous en avez besoin. Tout d'abord, si un propriétaire de moniteur appelle notifyAll(), tous les threads en attente sont réveillés les uns après les autres, donc si l'un des threads précédents a changé la condition, votre hypothèse à ce sujet ne sera plus vraie. La deuxième raison est Spurious wakeup. Comme la plupart des implémentations JVM s'appuient sur le modèle de threading du système d'exploitation et que certaines d'entre elles autorisent des réveils intempestifs (par souci de performance), vous devez être prêt à ce cas.

+0

Je pense que Doug Lea a commenté que les étudiants peuvent dans un état d'essayer de résoudre les rares situations où 'while' peut être retiré. Avec de fausses alertes, vous en aurez besoin, il n'y a donc pas besoin de discussions inutiles dans ce domaine. –

+0

L'existence de réveils intempestifs implique que les attentes doivent toujours se produire dans les boucles, donc ma réponse ne contredit pas ce qui est indiqué dans le livre de "Programmation simultanée en Java" de Doug Lea. –