— Salom, Amigo! Kecha biz ko'p oqimlik (multithreading) bilan keltirilgan qulayliklar va afzalliklarni muhokama qildik. Endi esa kamchiliklariga qarash vaqti keldi. Ular, afsuski, kichik emas.
Avvalroq dasturga obyektlar to'plami sifatida qarardik, ular bir-birining metodlarini chaqiradi. Endi hammasi biroz murakkablashgan. Dastur - bu bir nechta "kichik robotlar" - tarmoqlar - orqali ob'ektlar to'plamiga o'xshaydi va metodlarda keltirilgan buyruqlarni bajaradi.
Rasmiy ravishda - ikkinchisi birinchisini bekor qilmaydi. Bu hali ham obyektlar va ular hali ham bir-birining metodlarini chaqiradi. Ammo esingizdan chiqarmang, tarmoqlar ko'p, va har bir tarmoq o'z vazifasini - o'z topshirig'ini bajaradi.
Dastur murakkablashadi. Turli tarmoqlar turli obyektlarning holatini har birining bajaradigan vazifasiga muvofiq o'zgartiradi. Va ular bir-biriga halaqit berishi mumkin.
Ammo eng dahshatli narsa Java-mashinasining ichida sodir bo'ladi. Sizga aytganimdek, tarmoqlarning ko'rinadigan bir vaqtning o'zida ishlashi protsessor doimiy ravishda bir tarmoqdan ikkinchisiga o'zgargani uchun amalga oshadi. Tarmoqqa o'tishdi, 10 millisekund ishladi, keyingi tarmoqqa o'tdi, u yerda 10 millisekund ishladi va hokazo. Va bu yerda bir muammo paydo bo'ladi: o'zgarish eng noma'qul paytda sodir bo'lishi mumkin. Misol:
| Birinchi tarmoq kodi | Ikkinchi tarmoq kodi |
|---|---|
|
|
| Konsolda kutilgan natija |
|---|
| Kole 15 yoshda Lenega 21 yil |
| Yakuniy tartib | Birinchi tarmoq kodi | Ikkinchi tarmoq kodi |
|---|---|---|
|
|
|
| Konsolda haqiqiy natija |
|---|
| Kole Lenega 15 21 yoshda yil |
Yoki yana bir misol:
| Kod | Tavsif |
|---|---|
|
swap metodi name1 va name2 o'zgaruvchilarning qiymatlarini almashtiradi. |
Buni ikki tarmoqdan bir vaqtda chaqirsak nima bo'ladi?
| Yakuniy tartib | Birinchi tarmoq kodi | Ikkinchi tarmoq kodi |
|---|---|---|
|
|
|
| Natija |
|---|
| Har ikkala o'zgaruvchi "Lena" qiymatiga ega. "Olya" obyekti ustiga yozilgan va yo'qolgan. |
— Kim o'ylardi, oddiy tayinlashda shunday xatolar bo'lishi mumkinligini?
— Ha, lekin bu muammo uchun yechim bor. Lekin bu haqida biroz keyinroq - tomog'im quriyapti.
GO TO FULL VERSION