DeadLock och dess orsaker - 1

"Hej, Amigo!"

"Idag ska jag berätta vad dödläge är."

"Hej, du har redan berättat för mig om något sådant."

"Japp, det gjorde jag. Men idag ska vi överväga ämnet mer i detalj."

"I det enklaste fallet involverar dödläge två trådar och två mutex-objekt. En ömsesidig låsning uppstår när:"

A) Varje tråd måste förvärva båda mutexerna.

B)  Den första tråden har fått den första mutexen och väntar på att den andra ska släppas.

C)  Den andra tråden har fått den andra mutexen och väntar på att den första ska släppas.

"Här är några exempel:

Exempel
 public class Student
{
 private ArrayList friends = new ArrayList();

 public synchronized ArrayList getFriends()
 {
  synchronized(friends)
  {
   return new ArrayList(friends);
  }
 }

 public synchronized int getFriendsCount()
 {
  return friends.size();
 }

 public int addFriend(Student student)
 {
  synchronized(friends)
  {
   friends.add(student)
   return getFriendsCount ();
  }
 }
}

"Anta att en tråd anropar getFriends -metoden, förvärvar detta objekts mutex och sedan förvärvar friends -objektets mutex."

"Under tiden anropar en andra tråd addFriend- metoden, förvärvar friends -objektets mutex och förvärvar sedan det här objektets mutex (under ett anrop till getFriendsCount )."

"Till en början kommer allt att bli bra, men som Murphys lag säger: allt som kan gå fel kommer att gå fel. En situation kommer oundvikligen att uppstå där den första tråden bara kommer att ha tid att förvärva en mutex, och den andra tråden kommer att få den andra mutex just i det ögonblicket. De kommer att hänga så, för alltid att vänta på att den andra tråden ska släppa mutexen."

"Jag har bestämt mig för att citera ett annat enkelt exempel som jag hittade i en bok:"

Exempel
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  synchronized(knight1)
  {
   synchronized(knight2)
   {
    knight2.live = 0;
    knight1.experience += 100;
   }
  }
 }
}

"Det finns ett spel där två riddare slåss mot varandra. En riddare dödar den andra. Detta beteende återspeglas i dödningsmetoden. Två riddarobjekt skickas till den.

"För det första skyddar vi båda objekten så att ingen annan kan ändra dem."

"Den andra riddaren dör (HP = 0)"

"Den första riddaren vinner 100 XP."

"Allt verkar bra, men det kan finnas situationer där den andra riddaren attackerar den första samtidigt. Denna metod kallas också för den andra riddaren, men riddarobjekten skickas i en annan ordning."

"Du menar att vi inte ens behöver flera metoder för att få dödläge?"

"Och. Ibland krävs det bara en enkel metod för att få trådar, och hela programmet, att hänga sig."

"Ja, jag antar att det här fenomenet förekommer oftare än jag trodde. Tack, Ellie."