Strategi menghindari kebuntuan - 1

"Hai, Amigo!"

"Saya ingin memberi tahu Anda tentang beberapa strategi untuk menghindari kebuntuan."

"Strategi terbaik adalah arsitektur yang bijaksana dan seperangkat aturan yang mengatur kapan dan dalam urutan apa Anda dapat menggunakan kunci (memperoleh mutex). Pendekatan klasik untuk masalah ini adalah mengembangkan hierarki kunci dan menetapkan aturan bahwa kunci tertentu tidak akan pernah bisa diperoleh dalam keadaan di mana kunci tertentu lainnya telah diperoleh."

"Misalnya, kadang-kadang kunci diberikan level, dan utas diperlukan untuk memperoleh kunci agar dari level yang lebih tinggi ke level yang lebih rendah (tetapi memperoleh kunci di arah lain tidak diperbolehkan). Selain itu, memperoleh banyak kunci dengan level yang sama tidak diperbolehkan. diizinkan."

"Misalnya, pada contoh sebelumnya dengan ksatria, kita dapat menambahkan nomor unik (id) ke setiap ksatria dan meminta kunci diperoleh dari id yang lebih besar ke id yang lebih kecil."

Contoh
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  Knight knightMax = knight1.id > knight2.id ? knight1: knight2;
  Knight knightMin = knight1.id > knight2.id ? knight2: knight1;

  synchronized(knightMax)
  {
   synchronized(knightMin)
   {
    knight2.live = 0;
    knight1.experience +=100;
   }
  }
 }
}

"Itu solusi yang bagus."

"Ini adalah solusi yang sangat sederhana, tapi saya menyukainya. Saya harap ini akan berguna bagi Anda ketika Anda berpikir tentang bagaimana mengatasi potensi masalah kebuntuan."

"Terima kasih, Elli."