Strategien zur Vermeidung von DeadLock – 1

„Hallo, Amigo!“

„Ich möchte Ihnen ein paar Strategien zur Vermeidung von Deadlocks vorstellen.“

„Die beste Strategie ist eine durchdachte Architektur und eine Reihe von Regeln, die regeln, wann und in welcher Reihenfolge Sie Sperren verwenden (Mutexe erwerben) können. Der klassische Ansatz für das Problem besteht darin, eine Sperrenhierarchie zu entwickeln und die Regel festzulegen, dass bestimmte Sperren niemals vorhanden sein dürfen in einem Zustand erworben werden, in dem bereits bestimmte andere Schlösser erworben wurden.“

„Zum Beispiel werden Sperren manchmal Ebenen zugewiesen, und ein Thread muss Sperren in der Reihenfolge von höheren Ebenen zu niedrigeren Ebenen erwerben (das Erlangen von Sperren in die andere Richtung ist jedoch nicht zulässig). Darüber hinaus ist das Erlangen mehrerer Sperren mit derselben Ebene nicht zulässig.“ erlaubt."

„Im vorherigen Beispiel mit Rittern könnten wir beispielsweise jedem Ritter eine eindeutige Nummer (ID) hinzufügen und verlangen, dass Sperren von der größeren ID zur kleineren ID erworben werden.“

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

„Das ist eine schöne Lösung.“

„Es ist eine sehr einfache Lösung, aber sie gefällt mir. Ich hoffe, sie wird Ihnen nützlich sein, wenn Sie darüber nachdenken, wie Sie potenzielle Deadlock-Probleme lösen können.“

„Danke, Ellie.“