DeadLock og dens årsaker - 1

"Hei, Amigo!"

"I dag skal jeg fortelle deg hva dødlås er."

"Hei, du har allerede fortalt meg om noe sånt."

"Ja, det gjorde jeg. Men i dag skal vi vurdere temaet mer detaljert."

"I det enkleste tilfellet involverer deadlock to tråder og to mutex-objekter. En gjensidig låsing oppstår når:"

A) Hver tråd må skaffe begge mutexes.

B)  Den første tråden har fått den første mutexen og venter på at den andre skal slippes.

C)  Den andre tråden har fått den andre mutexen og venter på at den første skal slippes.

"Her er noen eksempler:

Eksempel
 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 at en tråd kaller getFriends- metoden, henter dette objektets mutex, og deretter anskaffer venner -objektets mutex."

"I mellomtiden kaller en andre tråd addFriend- metoden, henter venner -objektets mutex, og kjøper deretter dette objektets mutex (under et kall til getFriendsCount )."

"Til å begynne med vil alt være bra, men som Murphys lov sier: alt som kan gå galt vil gå galt. En situasjon vil uunngåelig oppstå der den første tråden bare vil ha tid til å skaffe seg en mutex, og den andre tråden vil få den andre mutex akkurat i det øyeblikket. De vil henge slik, for alltid å vente på at den andre tråden skal frigjøre mutexen."

"Jeg har bestemt meg for å sitere et annet enkelt eksempel jeg fant i en bok:"

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

"Det er et spill hvor to riddere kjemper mot hverandre. Den ene ridderen dreper den andre. Denne oppførselen gjenspeiles i drapsmetoden . To ridderobjekter sendes til den.

"For det første beskytter vi begge objektene slik at ingen andre kan endre dem."

"Den andre ridderen dør (HP = 0)"

"Den første ridderen får 100 XP."

"Alt virker greit, men det kan være situasjoner der den andre ridderen angriper den første samtidig. Denne metoden kalles også for den andre ridderen, men ridderobjektene passeres i en annen rekkefølge."

"Du mener at vi ikke engang trenger flere metoder for å få vranglås?"

"Riktig. Noen ganger tar det bare én enkel metode for å få tråder, og hele programmet, til å henge."

"Ja, jeg antar at dette fenomenet forekommer oftere enn jeg trodde. Takk, Ellie."