DeadLock dan puncanya - 1

"Hai, Amigo!"

"Hari ini saya akan memberitahu anda apa itu kebuntuan."

"Hei, awak sudah beritahu saya tentang perkara seperti itu."

"Ya, saya lakukan. Tetapi hari ini kita akan mempertimbangkan topik itu dengan lebih terperinci."

"Dalam kes paling mudah, kebuntuan melibatkan dua utas dan dua objek mutex. Kunci bersama berlaku apabila:"

A) Setiap benang perlu memperoleh kedua-dua mutex.

B)  Benang pertama telah memperoleh mutex pertama dan sedang menunggu untuk yang kedua dikeluarkan.

C)  Benang kedua telah memperoleh mutex kedua dan sedang menunggu untuk yang pertama dikeluarkan.

"Berikut adalah beberapa contoh:

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

"Misalkan benang memanggil kaedah getFriends , memperoleh mutex objek ini , dan kemudian memperoleh mutex objek rakan ."

"Sementara itu, benang kedua memanggil kaedah addFriend , memperoleh mutex objek rakan , dan kemudian memperoleh mutex objek ini (semasa panggilan ke getFriendsCount ).

"Pada mulanya, semuanya akan baik-baik saja, tetapi seperti yang dinyatakan oleh Undang-undang Murphy: apa-apa yang boleh menjadi salah akan menjadi salah. Satu situasi pasti akan timbul di mana benang pertama hanya mempunyai masa untuk memperoleh satu mutex, dan benang kedua akan memperoleh yang kedua mutex pada masa itu juga. Mereka akan tergantung seperti itu, selamanya menunggu benang lain melepaskan mutex."

"Saya telah memutuskan untuk memetik satu lagi contoh mudah yang saya temui dalam sebuah buku:"

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

"Ada permainan di mana dua kesatria berperang antara satu sama lain. Seorang kesatria membunuh yang lain. Tingkah laku ini tercermin dalam kaedah membunuh . Dua objek kesatria disalurkan kepadanya.

"Pertama, kami melindungi kedua-dua objek supaya tiada orang lain boleh mengubahnya."

"Ksatria kedua mati (HP = 0)"

"Kesatria pertama mendapat 100 XP."

"Semuanya nampak baik-baik saja, tetapi mungkin ada situasi di mana ksatria kedua menyerang ksatria pertama pada masa yang sama. Kaedah ini juga dipanggil untuk ksatria kedua, tetapi objek ksatria dilalui dalam susunan yang berbeza."

"Maksud anda kita tidak memerlukan pelbagai kaedah untuk menemui jalan buntu?"

"Betul. Kadang-kadang hanya memerlukan satu kaedah mudah untuk menyebabkan benang, dan keseluruhan program, digantung."

"Ya, saya rasa fenomena ini berlaku lebih kerap daripada yang saya fikirkan. Terima kasih, Ellie."