“สวัสดี อามีโก้!”
"และรายละเอียดอีกสองสามข้อ เรียกมันว่าคำแนะนำที่ใช้ได้จริง"
"สมมติว่าคุณมีวิธีการที่รออะไรบางอย่างและหลับไปจนกว่าเงื่อนไขจะพอใจ"
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"
"โอ้ เข้าใจแล้ว วิธีรอก็ไม่ดีถ้าไม่มีลูป"
GO TO FULL VERSION