JavaRush /Kurslar /All lectures for UZ purposes /Ko'p oqimlikning muammolari: umumiy resursga murojaat qil...

Ko'p oqimlikning muammolari: umumiy resursga murojaat qilish

All lectures for UZ purposes
Daraja, Dars
Mavjud

— 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
System.out.print ("Kole"); System.out.print (" "); System.out.print ("15"); System.out.print (" "); System.out.print ("yoshda");
System.out.println ();
System.out.print ("Lenega"); System.out.print (" "); System.out.print ("21"); System.out.print (" "); System.out.print ("yil");
System.out.println ();
Konsolda kutilgan natija
Kole 15 yoshda
Lenega 21 yil
Yakuniy tartib Birinchi tarmoq kodi Ikkinchi tarmoq kodi
System.out.print ("Kole");
System.out.print ("Lenega"); System.out.print (" ");
System.out.print (" "); System.out.print ("15");
System.out.print ("21"); System.out.print (" ");
System.out.print (" "); System.out.print ("yoshda"); System.out.println ();
System.out.print ("yil"); System.out.println ();
System.out.print ("Kole");
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
System.out.print (" "); System.out.print ("15"); //boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
System.out.print (" "); System.out.print ("yoshda"); System.out.println ();
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
System.out.print ("Lenega"); System.out.print (" ");
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
System.out.print ("21"); System.out.print (" ");
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
System.out.print ("yil"); System.out.println ();
Konsolda haqiqiy natija
Kole Lenega  15 21 yoshda
yil

Yoki yana bir misol:

Kod Tavsif
class MyClass
{
private String name1 = "Olya";
private String name2 = "Lena";
public void swap()
{
String s = name1;
name1 = name2;
name2 = s;
}
}
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
String s1 = name1; //Olya
name1 = name2; //Lena
String s2 = name1; //Lena(!)
name1 = name2; //Lena
name2 = s1; //Olya
name2 = s2; //Lena
String s1 = name1; name1 = name2;
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
name2 = s1;
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
//boshqa tarmoq ishlayapti
String s2 = name1; name1 = name2;
//boshqa tarmoq ishlayapti
name2 = s2;
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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION