“สวัสดี อามีโก้!”

"และรายละเอียดอีกสองสามข้อ เรียกมันว่าคำแนะนำที่ใช้ได้จริง"

"สมมติว่าคุณมีวิธีการที่รออะไรบางอย่างและหลับไปจนกว่าเงื่อนไขจะพอใจ"

หากคอลเลกชันว่างเปล่าเราจะรอ
public synchronized Runnable getJob()
{
 if (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"เอกสารประกอบของ Java แนะนำให้เรียกใช้เมธอด wait ในลูป:"

หากคอลเลกชันว่างเปล่าเราจะรอ
public synchronized Runnable getJob()
{
 while (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"ทำไมล่ะ? ประเด็นคือถ้าด้ายตื่นขึ้น นั่นไม่ได้หมายความว่าเป็นไปตามเงื่อนไข อาจจะมีด้ายหลับอยู่ถึงยี่สิบเส้น พวกมันทั้งหมดตื่นขึ้น แต่มีเพียงหนึ่งเดียวเท่านั้นที่สามารถดำเนินการได้"

"โดยคร่าวๆ อาจมี 'สัญญาณเตือนที่ผิดพลาด' นักพัฒนาที่ดีต้องคำนึงถึงเรื่องนี้ด้วย"

"เข้าใจแล้ว แค่ใช้การแจ้งเตือนง่ายกว่าไหม"

"แล้วถ้ามีมากกว่าหนึ่งงานในรายการล่ะ ปกติแล้วแนะนำให้ใช้การแจ้งเพื่อเพิ่มประสิทธิภาพ ในกรณีอื่นๆ แนะนำให้ใช้เมธอดการแจ้งทั้งหมด"

"ตกลง."

"แต่ยังมีมากกว่านั้น ประการแรก อาจมีสถานการณ์ที่ใครบางคนสืบทอดคลาสของคุณ เพิ่มเมธอดของตนเอง และใช้ wait/notifyAll อีกนัยหนึ่ง อาจมีสถานการณ์ที่คู่ wait/notifyAll แยกกันรอบนวัตถุเดียวกัน และไม่รู้จักกันเลย ทำไงดี"

"เรียกการรอในลูปเสมอ และตรวจสอบว่าเงื่อนไขการสิ้นสุดของลูปเป็นจริง!"

"ถูกต้อง และเพื่อให้ชัดเจนว่าคุณไม่สามารถหลีกเลี่ยงสิ่งนี้ได้ นักพัฒนาหลายคนชี้ให้เห็นว่าบางครั้งเธรดจะปลุกเอง เธรดที่รับประกันว่าจะไม่ถูกปลุกโดยไม่ตั้งใจ ดูเหมือนว่าจะเป็นผลข้างเคียงของการเพิ่มประสิทธิภาพโค้ดใน ใช้เครื่อง Java"

"โอ้ เข้าใจแล้ว วิธีรอก็ไม่ดีถ้าไม่มีลูป"