— Salom, Amigo!
Bugun men senga deadlock (DeadLock) — o‘zaro blokirovka nimani anglatishini tushuntiraman.
— Oldin ham biroz shunday narsalar haqida gapirgan eding.
— Ha, albatta. Ammo bugun bu mavzuni batafsilroq ko‘rib chiqamiz.
Eng oddiy holatda deadlockda ikki ip va ikki obyekt-mutex qatnashadi. O‘zaro blokirovka quyidagi hollarda yuzaga keladi:
A) Har bir ipning ishlash jarayonida ikkala mutexni ham egallashi kerak.
B) Birinchi ip birinchi mutexni egallab, ikkinchisi bo‘shashishini kutadi.
V) Ikkinchi ip ikkinchi mutexni egallab, birinchi bo‘shashishini kutadi.
Misollar:
public class Student
{
private ArrayList friends = new ArrayList();
public synchronized ArrayList getFriends()
{
synchronized(friends)
{
return new ArrayList(friends);
}
}
public synchronized int getFriendsCount()
{
return friends.size();
}
public int addFriend(Student student)
{
synchronized(friends)
{
friends.add(student)
return getFriendsCount();
}
}
}
Aytaylik, birinchi ip getFriends metodini chaqirdi, u avval this obyektining mutexini, keyin friends obyektining mutexini egallaydi.
Ikkinchi ip esa addFriend metodini chaqirdi, u avval friends obyektining mutexini, keyin esa this (chaqlayotuvi getFriendsCount) obyektining mutexini egallaydi.
Dastlab, hammasi yaxshi ketadi, lekin Merfi qonuni aytadi — agar biron-bir noxushlik yuz bersa, u albatta bo'ladi. Albatta, birinchi ip faqat bitta mutexni egallashi va ikkinchi ip esa ikkinchini egallashi mumkin bo‘lgan holat yuzaga keladi. Ular abadiy osilib qoladi va kimdir birinchi bo‘lib mutexni bo‘shatishini kutib qoladi.
Yana bir oddiy misol, kitobda ko‘rdim:
class KnightUtil
{
public static void kill(Knight knight1, Knight knight2)
{
synchronized(knight1)
{
synchronized(knight2)
{
knight2.live = 0;
knight1.experience +=100;
}
}
}
}
O'yin bor, unda ikki ritsar bir-biri bilan jang qiladi. Biri boshqasini o'ldiradi. Bu xulq-atvor kill metodida aks ettirilgan. U yerdan ikki ritsar-obyekti uzatiladi.
Dastlab, ikkala obyekt ham himoyalangan, shunda boshqa hech kim ularni o'zgartira olmaydi.
Ikkinchi ritsar o'ladi (live=0)
Birinchi ritsar 100 tajriba oladi.
Hammasi yaxshi ko'rinadi, lekin ba'zan ikkinchi ritsar birinchi ritsarni hujum qilayotgan vaqtida ham shunday holat yuz berishi mumkin. U uchun ham ushbu metod chaqiriladi, lekin ritsarlar boshqa tartibda uzatiladi.
— Demak, deadlock olish uchun bir nechta metodlar kerak emasmi?
— Ha. Ba'zan hatto oddiy bir metod ham yetarli bo'lishi mumkin, unda allaqachon iplar va butun dasturning osib qolishiga olib keladigan jarayonlar sodir bo'lishi mumkin.
— Ha, bu hodisa kutganimdan ko'ra tez-tez sodir bo'ladi ekan. Rahmat, Elli.
GO TO FULL VERSION