DeadLock dan penyebabnya - 1

"Hai, Amigo!"

"Hari ini aku akan memberitahumu apa itu kebuntuan."

"Hei, kamu sudah memberitahuku tentang hal seperti itu."

"Ya, memang. Tapi hari ini kita akan mempertimbangkan topik ini secara lebih rinci."

"Dalam kasus paling sederhana, kebuntuan melibatkan dua utas dan dua objek mutex. Kunci timbal balik terjadi ketika:"

A) Setiap utas harus mendapatkan kedua mutex.

B)  Utas pertama telah memperoleh mutex pertama dan sedang menunggu yang kedua dirilis.

C)  Utas kedua telah memperoleh mutex kedua dan sedang menunggu yang pertama dirilis.

"Ini beberapa contohnya:

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 sebuah utas memanggil metode getFriends , memperoleh mutex objek ini , dan kemudian memperoleh mutex objek teman ."

"Sementara itu, utas kedua memanggil metode addFriend , memperoleh mutex objek friends , dan kemudian memperoleh mutex objek this (selama panggilan ke getFriendsCount )."

"Pada awalnya, semuanya akan baik-baik saja, tetapi seperti yang dinyatakan Hukum Murphy: apa pun yang salah akan salah. Situasi pasti akan muncul di mana utas pertama hanya akan memiliki waktu untuk mendapatkan satu mutex, dan utas kedua akan memperoleh yang kedua. mutex pada saat itu juga. Mereka akan menggantung seperti itu, selamanya menunggu utas lainnya melepaskan mutex."

"Saya telah memutuskan untuk mengutip contoh sederhana lain yang saya temukan di 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 bertarung satu sama lain. Satu kesatria membunuh yang lain. Perilaku ini tercermin dalam metode membunuh . Dua objek kesatria diberikan padanya.

"Pertama, kami melindungi kedua objek sehingga tidak ada orang lain yang dapat mengubahnya."

"Ksatria kedua mati (HP = 0)"

"Ksatria pertama mendapatkan 100 XP."

"Semuanya tampak baik-baik saja, tetapi mungkin ada situasi di mana ksatria kedua menyerang yang pertama pada saat yang sama. Metode ini juga digunakan untuk ksatria kedua, tetapi objek ksatria diteruskan dalam urutan yang berbeda."

"Maksudmu kita bahkan tidak memerlukan banyak metode untuk menemui jalan buntu?"

"Benar. Terkadang hanya dibutuhkan satu metode sederhana untuk menyebabkan utas, dan seluruh program, hang."

"Ya, kurasa fenomena ini lebih sering terjadi daripada yang kukira. Terima kasih, Ellie."