Strategii pentru a evita deadLock - 1

"Bună, Amigo!"

„Vreau să vă spun despre câteva strategii pentru evitarea blocajelor”.

„Cea mai bună strategie este o arhitectură atentă și un set de reguli care guvernează când și în ce ordine puteți utiliza încuietori (achiziționați mutexuri). Abordarea clasică a problemei este de a dezvolta o ierarhie a lacăturilor și de a stabili regula conform căreia anumite încuietori nu pot fi niciodată dobândite într-o stare în care anumite alte lacăte au fost deja achiziționate.”

„De exemplu, uneori, lacăturilor li se atribuie niveluri și este necesar un fir pentru a obține încuietori în ordine de la niveluri superioare la niveluri inferioare (dar nu este permisă obținerea de lacăte în cealaltă direcție). În plus, achiziționarea de încuietori multiple cu același nivel nu este permisă permis."

„De exemplu, în exemplul anterior cu cavaleri, am putea adăuga un număr unic (id) fiecărui cavaler și am putea solicita ca încuietori să fie achiziționate de la id-ul mai mare la id-ul mai mic.”

Exemplu
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;
   }
  }
 }
}

"Aceasta este o soluție frumoasă."

„Este o soluție foarte simplă, dar îmi place. Sper că îți va fi de folos atunci când te gândești cum să rezolvi potențialele probleme de blocaj.”

— Mulțumesc, Ellie.