Stratégies pour éviter deadLock - 1

« Salut Amigo ! »

"Je veux vous parler de quelques stratégies pour éviter les impasses."

"La meilleure stratégie est une architecture réfléchie et un ensemble de règles régissant quand et dans quel ordre vous pouvez utiliser des verrous (acquérir des mutex). L'approche classique du problème consiste à développer une hiérarchie de verrous et à établir la règle selon laquelle certains verrous ne peuvent jamais être acquis dans un état où certaines autres serrures ont déjà été acquises."

"Par exemple, des niveaux sont parfois attribués aux verrous et un thread doit acquérir des verrous dans l'ordre des niveaux supérieurs aux niveaux inférieurs (mais l'acquisition de verrous dans l'autre sens n'est pas autorisée). De plus, l'acquisition de plusieurs verrous avec le même niveau n'est pas autorisé."

"Par exemple, dans l'exemple précédent avec des chevaliers, nous pourrions ajouter un numéro unique (id) à chaque chevalier et exiger que les verrous soient acquis du plus grand identifiant au plus petit."

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

"C'est une belle solution."

"C'est une solution très simple, mais je l'aime bien. J'espère qu'elle vous sera utile lorsque vous réfléchirez à la manière de résoudre les problèmes de blocage potentiels."

"Merci, Ellie."