DeadLock és okai - 1

– Szia Amigo!

– Ma el fogom mondani, mi az a holtpont.

– Hé, már meséltél nekem ilyesmiről.

"Igen, igen. De ma részletesebben megvizsgáljuk a témát."

"A legegyszerűbb esetben a holtpont két szálat és két mutex objektumot foglal magában. A kölcsönös zárolás akkor következik be, ha:

A) Minden szálnak meg kell szereznie mindkét mutexet.

B)  Az első szál megszerezte az első mutexet, és várja a második felszabadulását.

C)  A második szál megszerezte a második mutexet, és várja az első felszabadulását.

"Íme néhány példa:

Példa
 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 ();
  }
 }
}

"Tegyük fel, hogy egy szál meghívja a getFriends metódust, beszerzi ennek az objektumnak a mutexét, majd beszerzi a friends objektum mutexét."

"Eközben egy második szál meghívja az addFriend metódust, beszerzi a friends objektum mutexét, majd beszerzi ennek az objektumnak a mutexét (a getFriendsCount hívása során )."

"Először minden rendben lesz, de ahogy Murphy törvénye kimondja: ami elromolhat, az el is romlik. Elkerülhetetlenül adódik olyan helyzet, hogy az első szálnak csak egy mutexet lesz ideje megszerezni, a második szálnak pedig a másodikat. mutex abban a pillanatban. Úgy fognak lógni, örökké arra várva, hogy a másik szál kiadja a mutexet."

"Úgy döntöttem, hogy idézek egy másik egyszerű példát, amelyet egy könyvben találtam:"

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

"Van egy játék, ahol két lovag harcol egymással. Az egyik lovag megöli a másikat. Ez a viselkedés az ölési módszerben is megmutatkozik . Két lovagi tárgyat adnak át neki.

"Először is megvédjük mindkét tárgyat, hogy senki más ne tudja megváltoztatni."

"A második lovag meghal (HP = 0)"

"Az első lovag 100 XP-t kap."

"Minden rendben van, de előfordulhatnak olyan helyzetek, amikor a második lovag egyszerre támadja meg az elsőt. Ezt a módszert a második lovagnál is hívják, de a lovag tárgyakat más sorrendben adják át."

– Úgy érted, nincs is szükségünk több módszerre a holtpontra jutáshoz?

"Helyes. Néha egyetlen egyszerű módszerre van szükség ahhoz, hogy a szálakat és az egész programot lefagyjon."

"Igen, azt hiszem, ez a jelenség gyakrabban fordul elő, mint gondoltam. Köszönöm, Ellie."