Strategier för att undvika deadLock - 1

"Hej, Amigo!"

"Jag vill berätta om ett par strategier för att undvika dödlägen."

"Den bästa strategin är en genomtänkt arkitektur och en uppsättning regler som styr när och i vilken ordning du kan använda lås (skaffa mutexes). Det klassiska förhållningssättet till problemet är att utveckla en låshierarki och fastställa regeln att vissa lås aldrig kan vara förvärvade i ett tillstånd där vissa andra lås redan har förvärvats."

"Till exempel, ibland tilldelas lås nivåer, och en tråd krävs för att skaffa lås i ordning från högre nivåer till lägre nivåer (men att skaffa lås i den andra riktningen är inte tillåtet). Dessutom är det inte tillåtet att skaffa flera lås med samma nivå tillåten."

"Till exempel, i det föregående exemplet med riddare, kunde vi lägga till ett unikt nummer (id) till varje riddare och kräva att lås skaffas från det större ID:t till det mindre ID:t."

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

"Det är en vacker lösning."

"Det är en väldigt enkel lösning, men jag gillar den. Jag hoppas att den kommer att vara användbar för dig när du funderar på hur du ska lösa potentiella dödlägesproblem."

"Tack, Ellie."