– 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:
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:"
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."
GO TO FULL VERSION