DeadLock at mga sanhi nito - 1

"Hi, Amigo!"

"Ngayon sasabihin ko sa iyo kung ano ang deadlock."

"Hoy, nasabi mo na sa akin ang tungkol sa ganyan."

"Yep, I did. But today we'll consider the topic in greater detail."

"Sa pinakasimpleng kaso, ang deadlock ay nagsasangkot ng dalawang thread at dalawang mutex na bagay. Ang magkaparehong lock ay nangyayari kapag:"

A) Ang bawat thread ay kailangang makakuha ng parehong mutexes.

B)  Nakuha ng unang thread ang unang mutex at naghihintay na mailabas ang pangalawa.

C)  Nakuha ng pangalawang thread ang pangalawang mutex at naghihintay na mailabas ang una.

"Narito ang ilang mga halimbawa:

Halimbawa
 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 ();
  }
 }
}

"Ipagpalagay na tinawag ng isang thread ang getFriends method, nakuha ang mutex ng object na ito , at pagkatapos ay nakuha ang mutex ng object ng kaibigan ."

"Samantala, ang pangalawang thread ay tumatawag sa paraan ng addFriend , nakakakuha ng mutex ng object ng kaibigan , at pagkatapos ay nakakuha ng mutex ng bagay na ito (sa panahon ng isang tawag sa getFriendsCount ).

"Sa una, magiging maayos ang lahat, ngunit tulad ng sinabi ng Batas ni Murphy: anumang bagay na maaaring magkamali ay magkakamali. Ang isang sitwasyon ay hindi maiiwasang lumitaw kung saan ang unang thread ay magkakaroon lamang ng oras upang makakuha ng isang mutex, at ang pangalawang thread ay makakakuha ng pangalawa. mutex at that very moment. Ganun sila mabibitin, forever waiting for the other thread to release the mutex."

"Napagpasyahan kong mag-quote ng isa pang simpleng halimbawa na nakita ko sa isang libro:"

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

"May laro kung saan dalawang kabalyero ang nag-aaway. Pinapatay ng isang kabalyero ang isa pa. Ang pag-uugaling ito ay makikita sa paraan ng pagpatay . Dalawang bagay na kabalyero ang ipinapasa dito.

"Una, pinoprotektahan namin ang parehong mga bagay upang walang ibang makapagpapalit sa kanila."

"Namatay ang pangalawang kabalyero (HP = 0)"

"Ang unang kabalyero ay nakakakuha ng 100 XP."

"Mukhang maayos ang lahat, ngunit maaaring may mga sitwasyon kung saan ang pangalawang kabalyero ay umaatake sa una sa parehong oras. Ang pamamaraang ito ay tinatawag din para sa pangalawang kabalyero, ngunit ang mga bagay na kabalyero ay ipinapasa sa ibang pagkakasunud-sunod."

"Ibig mong sabihin hindi na natin kailangan ng maraming paraan para magkaroon ng deadlock?"

"Tama. Minsan kailangan lang ng isang simpleng paraan para mag-hang ang mga thread, at ang buong programa."

"Oo, sa palagay ko ang phenomenon na ito ay nangyayari nang mas madalas kaysa sa naisip ko. Salamat, Ellie."