— Salom, Amigo!
Yana bir necha tafsilotlar. Praktik maslahatlar deya olamiz.
Agar sende bir metod bo'lsa, u bir narsani kutib uxlab qolar ekan, shart bajarilmaguncha.
public synchronized Runnable getJob()
{
if (jobs.size()==0)
this.wait();
return jobs.remove(0);
}
Java hujjatlarida metoda waitni siklda chaqirishni juda tavsiya qilishadi:
public synchronized Runnable getJob()
{
while (jobs.size()==0)
this.wait();
return jobs.remove(0);
}
Nima uchun bu kerak. Gap shundaki, shunday uxlab yotgan iplar uchraydi, ularni uyg'otish mumkin, lekin faqat bitta topshiriq olish mumkin. Ipni uyg'otishdi – lekin bu hali shart bajarilgan degani emas!
Umuman olganda, "yolg'on uyg'onishlar" bo'lishi mumkin. Yaxshi dasturchi bu narsani hisobga olishi kerak.
— Tushunarli. Shunda notify dan foydalanganda osonroq bo'lmasmidi?
— Agar ro'yxatda bitta topshiriqdan ko'proq bo'lsa nima bo'ladi? Notify odatda optimizatsiya uchun tavsiya qilinadi. Boshqa hollarda notifyAll metodini ishlatishni tavsiya qilishadi.
— Ok.
— Lekin bu hammasi emas. Birinchidan, kimdir sizning klassingizdan meros olib, o'z metodlarini qo'shib, wait/notifyAll dan foydalangan bo'lishi mumkin. Demak, bir obyekt ustida bir-biridan mustaqil wait/notifyAll mexanizmlari mavjud bo'lishi mumkin. Nima qilish kerak?
— Har doim waitni siklda chaqirish va sikldan chiqish sharti haqiqatan ham bajarilganligini tekshirish!
— To'g'ri. Va shuni tushunib olishingiz uchun, ko'pchilik dasturchilar ayrim iplar o'z-o'zidan uyg'onishi mumkinligini ta'kidlaydi. Tabiiyki, hech kim ularni tasodifan uyg'ota olmaydi. Bu Java-mashinada ishlayotgan kodni optimallashtirish/tezlashtirishning yon ta'siri bo'lishi mumkin.
— Qoyil, tushundim, waitdan oldin sikl muhim ekan.
GO TO FULL VERSION