— Salom, Amigo!
Senga deadlocklardan qochish uchun bir nechta strategiyalar haqida aytib bermoqchiman.
Eng yaxshi strategiya – bu o'ylangan arxitektura va qachon blokirovkalarni (mutexlarni qo'lga olish) ishlatish mumkinligiga va qanday tartibda ishlatilishiga qoidalar to'plamini ishlab chiqishdir. Muammoni hal qilishning klassik usuli — bu blokirovkalar iyerarxiyasini ishlab chiqish, ba'zi blokirovkalar boshqa biror blokirovka qo'lga olingan holatda hech qachon qo'lga olinmasligi kerak degan qoida o'rnatishdir.
Ba'zida masalan, blokirovkalarga darajalar belgilanadi va ipdan yuqori darajadan pastga o‘tish tartibida, lekin teskari emas, blokirovkalarni qo‘llash talab qilinadi. Shuningdek, bir xil darajadagi bir nechta blokirovkalarni qo'lga olish mumkin emas.
Masalan, oldingi misolda ritsarlarga har biriga noyob raqam (id) qo'shish mumkin va blokirovkalarni yuqori id dan pastroq id ga o'tishini talab qilsa bo'ladi.
class KnightUtil
{
public static void kill(Knight knight1, Knight knight2)
{
Knight knightMax = knight1.id > knight2.id ? knight1: knight2;
Knight knightMin = knight1.id > knight2.id ? knight2: knight1;
synchronized(knightMax)
{
synchronized(knightMin)
{
knight2.live = 0; // Kodatilganligini ('live') 0 ga o'rnatish
knight1.experience +=100; // Tajribani 100 ga oshirish
}
}
}
}
— Ajoyib yechim.
— Bu juda oddiy yechim, lekin menga yoqadi. Umid qilamanki, bu senga deadlock muammolari haqida o'ylab ko'rishga yordam beradi.
— Rahmat, Eli.
GO TO FULL VERSION