DeadLock ve nedenleri - 1

"Merhaba, Amigo!"

"Bugün size kilitlenmenin ne olduğunu anlatacağım."

"Hey, bana zaten böyle bir şeyden bahsetmiştin."

"Evet, yaptım. Ama bugün konuyu daha ayrıntılı olarak ele alacağız."

"En basit durumda, kilitlenme iki iş parçacığı ve iki muteks nesnesi içerir. Karşılıklı kilit şu durumlarda oluşur:"

A) Her iş parçacığının her iki muteksi de alması gerekir.

B)  İlk iş parçacığı ilk muteksi almıştır ve ikincisinin serbest bırakılmasını beklemektedir.

C)  İkinci iş parçacığı ikinci muteksi almıştır ve birincisinin serbest bırakılmasını beklemektedir.

"İşte bazı örnekler:

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

"Bir iş parçacığının getFriends yöntemini çağırdığını, bu nesnenin muteksini aldığını ve ardından friends nesnesinin muteksini aldığını varsayalım."

"Bu arada, ikinci bir iş parçacığı addFriend yöntemini çağırır, friends nesnesinin muteksini alır ve sonra bu nesnenin muteksini alır ( getFriendsCount çağrısı sırasında )."

"Başlangıçta her şey iyi olacak, ancak Murphy Yasası'nın belirttiği gibi: ters gidebilecek her şey ters gidecektir. Kaçınılmaz olarak, ilk iş parçacığının yalnızca bir muteks edinmek için zamana sahip olacağı ve ikinci iş parçacığının ikinciyi alacağı bir durum ortaya çıkacaktır. Bu şekilde askıda kalacaklar, sonsuza kadar diğer iş parçacığının muteksi serbest bırakmasını bekleyecekler."

"Bir kitapta bulduğum başka bir basit örneği alıntılamaya karar verdim:"

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

"İki şövalyenin birbiriyle dövüştüğü bir oyun var. Bir şövalye diğerini öldürüyor. Bu davranış öldürme yöntemine de yansıyor . Ona iki şövalye nesnesi geçiyor.

"Öncelikle, iki nesneyi de koruyoruz, böylece kimse onları değiştiremez."

"İkinci şövalye ölür (HP = 0)"

"İlk şövalye 100 XP kazanır."

"Her şey yolunda görünüyor, ancak ikinci atın aynı anda birinciye saldırdığı durumlar olabilir. Bu yöntem ikinci şövalye için de çağrılır, ancak şövalye nesneleri farklı bir sırayla geçirilir."

"Kilitlenmek için birden çok yönteme ihtiyacımız olmadığını mı söylüyorsunuz?"

"Doğru. Bazen ileti dizilerinin ve tüm programın askıda kalmasına neden olmak için yalnızca tek bir basit yöntem gerekir."

"Evet, sanırım bu fenomen düşündüğümden daha sık meydana geliyor. Teşekkürler Ellie."