DeadLock'tan kaçınma stratejileri - 1

"Merhaba, Amigo!"

"Size kilitlenmelerden kaçınmak için birkaç stratejiden bahsetmek istiyorum."

"En iyi strateji, iyi düşünülmüş bir mimari ve kilitleri ne zaman ve hangi sırayla kullanabileceğinizi (muteksler edinin) yöneten bir dizi kuraldır. Soruna yönelik klasik yaklaşım, bir kilit hiyerarşisi geliştirmek ve belirli kilitlerin asla kullanılamayacağı kuralını oluşturmaktır. diğer bazı kilitlerin zaten alınmış olduğu bir durumda elde edilmiş."

"Örneğin, bazen kilitler seviyelere atanır ve daha yüksek seviyelerden daha düşük seviyelere doğru kilit almak için bir iş parçacığı gerekir (ancak diğer yönde kilitlerin alınmasına izin verilmez). Ek olarak, aynı seviyede birden fazla kilit elde etmek mümkün değildir. izin verilmiş."

"Örneğin, şövalyelerle ilgili önceki örnekte, her şövalyeye benzersiz bir numara (id) ekleyebilir ve kilitlerin daha büyük id'den daha küçük id'ye alınmasını isteyebiliriz."

Örnek
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;
   }
  }
 }
}

"Bu çok güzel bir çözüm."

"Çok basit bir çözüm ama hoşuma gitti. Olası kilitlenme sorunlarını nasıl çözeceğinizi düşünürken umarım işinize yarar."

"Teşekkürler Ellie."