„Здрасти, Амиго!“
„Искам да ви разкажа за няколко стратегии за избягване на безизходица.“
„Най-добрата стратегия е обмислена архитектура и набор от правила, управляващи кога и в Howъв ред можете да използвате ключалки (придобиване на мутекси). Класическият подход към проблема е да се разработи йерархия на заключванията и да се установи правилото, че определени ключалки никога не могат да бъдат придобити в състояние, в което някои други брави вече са придобити."
„Например, понякога на заключванията се присвояват нива и се изисква нишка за придобиване на заключвания в ред от по-високи нива към по-ниски нива (но получаването на заключвания в другата посока не е разрешено). Освен това придобиването на множество заключвания с едно и също ниво не е позволен."
„Например, в предишния пример с рицари, бихме могли да добавим уникален номер (id) към всеки рицар и да изискваме брави да бъдат получени от по-големия id към по-малкия id.“
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;
knight1.experience +=100;
}
}
}
}
"Това е красиво решение."
„Това е много просто решение, но ми харесва. Надявам се, че ще ви бъде полезно, когато мислите How да разрешите потенциални проблеми с безизходица.“
— Благодаря, Ели.
GO TO FULL VERSION