"Merhaba, Amigo!"

"Ve birkaç ayrıntı daha. Buna pratik tavsiye diyelim."

"Bir şeyi bekleyen ve bir koşul sağlanana kadar uykuya dalan bir yönteminiz olduğunu varsayalım."

Koleksiyon boşsa, bekleriz
public synchronized Runnable getJob()
{
 if (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"Java belgeleri, bekleme yönteminin bir döngüde çağrılmasını çok ısrarla önerir:"

Koleksiyon boşsa, bekleriz
public synchronized Runnable getJob()
{
 while (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"Neden? Mesele şu ki, iş parçacığı uyanıyorsa, bu koşulun sağlandığı anlamına gelmez. Belki de böyle yirmi tane uyuyan iş parçacığı vardı. Hepsi uyandı ama yalnızca biri görevi üstlenebilir."

"Kabaca söylemek gerekirse, 'yanlış alarmlar' olabilir. İyi bir geliştirici bunu hesaba katmalıdır."

"Anlıyorum. Bildirimi kullanmak daha kolay değil mi?"

"Peki ya listede birden fazla görev varsa? Optimizasyon adına genellikle Notify kullanılması önerilir. Diğer tüm durumlarda, notifyAll yöntemini kullanmanız önerilir."

"TAMAM."

"Ama dahası da var. Birincisi, birisinin sınıfınızı devraldığı, kendi yöntemlerini eklediği ve ayrıca wait/notifyAll kullandığı bir durum olabilir. Diğer bir deyişle, bağımsız wait/notifyAll çiftlerinin aynı nesne üzerinde beklediği bir durum olabilir. ve birbirinizi tanımıyorsunuz. Peki ne yapmalısınız?

"Her zaman beklemeyi bir döngüde arayın ve döngünün sonlandırma koşulunun doğru olup olmadığını kontrol edin!"

"Doğru. Bundan kaçamayacağınızı açıkça ortaya koymak için, birçok geliştirici bazen ileti dizilerinin kendi kendine uyandığına dikkat çekiyor. Yanlışlıkla uyandırılmaması garanti edilen ileti dizileri. Bu, kod optimizasyonunun bir yan etkisi gibi görünüyor. çalışan Java makinesi."

"Vay. Anladım. Döngü olmadan bekleme yöntemi işe yaramaz."