"Hei, Amigo!"

"Og et par detaljer til. La oss kalle det praktiske råd."

"Anta at du har en metode som venter på noe og sovner til en tilstand er oppfylt."

Hvis samlingen er tom, så venter vi
public synchronized Runnable getJob()
{
 if (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"Java-dokumentasjonen anbefaler veldig insisterende å kalle ventemetoden i en løkke:"

Hvis samlingen er tom, så venter vi
public synchronized Runnable getJob()
{
 while (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"Hvorfor? Saken er den at hvis tråden våkner, betyr ikke det at tilstanden er oppfylt. Kanskje var det tjue slike sovetråder. Alle våknet, men bare én kan ta oppgaven."

- Grovt sett kan det være «falske alarmer». En god utbygger må ta hensyn til dette.

"Jeg skjønner. Er det ikke lettere å bare bruke varsling?"

"Vel, hva om det var mer enn én oppgave på listen? Notify anbefales vanligvis å bruke for optimaliseringens skyld. I alle andre tilfeller anbefales det å bruke notifyAll-metoden."

"OK."

"Men det er mer. For det første kan det være en situasjon der noen arver klassen din, legger til sine egne metoder, og også bruker wait/notifyAll. Med andre ord kan det være en situasjon der uavhengige wait/notifyAll-par venter på samme objekt og vet ikke om hverandre. Så hva bør du gjøre?"

"Kall alltid vente i en sløyfe og sjekk at sløyfens termineringsbetingelse er sann!"

"Riktig. Og for å gjøre det helt klart at du ikke kan unnslippe dette, påpeker mange utviklere at noen ganger våkner tråder av seg selv. Tråder som garantert ikke blir vekket ved et uhell. Dette ser ut til å være bivirkning av kodeoptimalisering i en kjører Java-maskin."

"Wow. Skjønner. Uten en løkke er ventemetoden ikke bra."