"Hai, Amigo!"

"Dan beberapa detail lagi. Sebut saja saran praktis."

"Misalkan Anda memiliki metode yang menunggu sesuatu dan tertidur sampai suatu kondisi terpenuhi."

Jika koleksinya kosong, maka kami menunggu
public synchronized Runnable getJob()
{
 if (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"Dokumentasi Java sangat merekomendasikan memanggil metode tunggu dalam satu lingkaran:"

Jika koleksinya kosong, maka kami menunggu
public synchronized Runnable getJob()
{
 while (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"Mengapa? Masalahnya adalah jika utasnya bangun, itu tidak berarti kondisinya terpenuhi. Mungkin ada dua puluh utas yang tertidur. Semuanya bangun, tetapi hanya satu yang dapat mengambil tugas."

"Secara kasar, mungkin ada 'alarm palsu'. Pengembang yang baik harus memperhitungkan ini."

"Begitu. Bukankah lebih mudah menggunakan notifikasi saja?"

"Nah, bagaimana jika ada lebih dari satu tugas dalam daftar? Beri tahu biasanya disarankan untuk digunakan demi pengoptimalan. Dalam semua kasus lainnya, disarankan untuk menggunakan metode notifyAll."

"OKE."

"Tapi masih ada lagi. Pertama, mungkin ada situasi di mana seseorang mewarisi kelas Anda, menambahkan metode mereka sendiri, dan juga menggunakan wait/notifyAll. Dengan kata lain, mungkin ada situasi di mana pasangan wait/notifyAll independen menunggu pada objek yang sama dan tidak tahu tentang satu sama lain. Jadi apa yang harus kamu lakukan?"

"Selalu panggil tunggu dalam satu putaran dan periksa apakah kondisi penghentian putaran itu benar!"

"Benar. Dan untuk memperjelas bahwa Anda tidak dapat menghindarinya, banyak pengembang menunjukkan bahwa terkadang utas terbangun dengan sendirinya. Utas yang dijamin tidak akan terbangun secara tidak sengaja. Ini tampaknya merupakan efek samping dari pengoptimalan kode di a menjalankan mesin Java."

"Whoa. Mengerti. Tanpa putaran, metode menunggu tidak bagus."