DeadLock og dens årsager - 1

"Hej, Amigo!"

"I dag vil jeg fortælle dig, hvad dødvande er."

"Hej, du har allerede fortalt mig om sådan noget."

"Ja, det gjorde jeg. Men i dag vil vi overveje emnet mere detaljeret."

"I det enkleste tilfælde involverer deadlock to tråde og to mutex-objekter. En gensidig låsning opstår, når:"

A) Hver tråd skal erhverve begge mutexes.

B)  Den første tråd har fået den første mutex og venter på, at den anden bliver frigivet.

C)  Den anden tråd har fået den anden mutex og venter på, at den første bliver frigivet.

"Her er nogle 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 ();
  }
 }
}

"Antag, at en tråd kalder getFriends- metoden, erhverver dette objekts mutex og derefter erhverver friends- objektets mutex."

"I mellemtiden kalder en anden tråd addFriend- metoden, henter friends - objektets mutex og henter derefter dette objekts mutex (under et kald til getFriendsCount )."

"I starten vil alt være godt, men som Murphys lov siger: alt, der kan gå galt, vil gå galt. Der vil uundgåeligt opstå en situation, hvor den første tråd kun vil have tid til at erhverve én mutex, og den anden tråd vil erhverve den anden. mutex lige i det øjeblik. De vil hænge sådan og for evigt vente på, at den anden tråd frigiver mutexen."

"Jeg har besluttet at citere et andet simpelt eksempel, jeg fandt i en bog:"

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

"Der er et spil, hvor to riddere kæmper mod hinanden. Den ene ridder dræber den anden. Denne adfærd afspejles i drabsmetoden . To ridderobjekter sendes til den.

"For det første beskytter vi begge genstande, så ingen andre kan ændre dem."

"Den anden ridder dør (HP = 0)"

"Den første ridder vinder 100 XP."

"Alt virker fint, men der kan være situationer, hvor den anden ridder angriber den første på samme tid. Denne metode kaldes også for den anden ridder, men ridderobjekterne passeres i en anden rækkefølge."

"Du mener, at vi ikke engang har brug for flere metoder for at få dødvande?"

"Godt. Nogle gange skal der kun én simpel metode til for at få tråde og hele programmet til at hænge."

"Ja, dette fænomen forekommer vel oftere, end jeg troede. Tak, Ellie."