Strategie per evitare il deadlock - 1

"Ciao, Amico!"

"Voglio parlarti di un paio di strategie per evitare situazioni di stallo."

"La migliore strategia è un'architettura ponderata e un insieme di regole che stabiliscono quando e in quale ordine è possibile utilizzare i blocchi (acquisire mutex). L'approccio classico al problema è sviluppare una gerarchia di blocchi e stabilire la regola secondo cui determinati blocchi non possono mai essere acquisita in uno stato in cui sono già state acquisite altre serrature."

"Ad esempio, a volte ai blocchi vengono assegnati livelli ed è necessario un thread per acquisire blocchi in ordine dai livelli superiori a quelli inferiori (ma l'acquisizione di blocchi nell'altra direzione non è consentita). Inoltre, l'acquisizione di più blocchi con lo stesso livello non è consentita consentito."

"Ad esempio, nell'esempio precedente con i cavalieri, potremmo aggiungere un numero univoco (id) a ciascun cavaliere e richiedere che i blocchi vengano acquisiti dall'id più grande all'id più piccolo."

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

"Questa è una bella soluzione."

"È una soluzione molto semplice, ma mi piace. Spero che ti sarà utile quando penserai a come risolvere potenziali problemi di stallo."

"Grazie, Eli."