Стратегии за избягване на deadLock - 1

„Здрасти, Амиго!“

„Искам да ви разкажа за няколко стратегии за избягване на безизходица.“

„Най-добрата стратегия е обмислена архитектура и набор от правила, управляващи кога и в 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 да разрешите потенциални проблеми с безизходица.“

— Благодаря, Ели.