डेडलॉक आणि त्याची कारणे - १

"हाय, अमिगो!"

"आज मी तुम्हाला डेडलॉक म्हणजे काय ते सांगणार आहे."

"अरे, तू मला आधीच असे काहीतरी सांगितले आहेस."

"हो, मी केले. पण आज आपण या विषयावर अधिक तपशीलवार विचार करू."

"सर्वात सोप्या प्रकरणात, डेडलॉकमध्ये दोन थ्रेड आणि दोन म्युटेक्स ऑब्जेक्ट्सचा समावेश होतो. म्युच्युअल लॉक तेव्हा उद्भवते जेव्हा:"

अ) प्रत्येक थ्रेडला दोन्ही म्यूटेक्स घेणे आवश्यक आहे.

ब)  पहिल्या थ्रेडने पहिले म्युटेक्स मिळवले आहे आणि दुसरा रिलीझ होण्याची वाट पाहत आहे.

क)  दुसऱ्या थ्रेडने दुसरा म्युटेक्स मिळवला आहे आणि तो पहिला रिलीझ होण्याची वाट पाहत आहे.

"येथे काही उदाहरणे आहेत:

उदाहरण
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 ();
  }
 }
}

"समजा एखादा थ्रेड getFriends मेथडला कॉल करतो, या ऑब्जेक्टचे mutex मिळवतो आणि नंतर फ्रेंड ऑब्जेक्टचे mutex मिळवतो."

"यादरम्यान, दुसरा थ्रेड addFriend पद्धतीला कॉल करतो, फ्रेंड ऑब्जेक्टचे म्यूटेक्स मिळवतो आणि नंतर या ऑब्जेक्टचे म्यूटेक्स ( getFriendsCount वर कॉल करताना ) मिळवतो."

"सुरुवातीला, सर्व काही ठीक होईल, परंतु मर्फीच्या नियमानुसार: जे काही चुकीचे होऊ शकते ते चुकीचे होईल. अशी परिस्थिती अपरिहार्यपणे उद्भवेल जिथे पहिल्या थ्रेडला फक्त एक म्यूटेक्स घेण्यासाठी वेळ असेल आणि दुसरा धागा दुसरा मिळवेल. त्याच क्षणी mutex. ते असेच लटकतील, कायमचे mutex सोडण्यासाठी दुसऱ्या धाग्याची वाट पाहत आहेत."

"मला पुस्तकात सापडलेले आणखी एक साधे उदाहरण उद्धृत करण्याचे मी ठरवले आहे:"

उदाहरण
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  synchronized(knight1)
  {
   synchronized(knight2)
   {
    knight2.live = 0;
    knight1.experience += 100;
   }
  }
 }
}

"एक खेळ आहे जिथे दोन शूरवीर एकमेकांशी लढत आहेत. एक शूरवीर दुसर्‍याला मारतो. हे वर्तन मारण्याच्या पद्धतीत प्रतिबिंबित होते. दोन नाइट वस्तू त्यामध्ये दिल्या जातात.

"प्रथम, आम्ही दोन्ही वस्तूंचे संरक्षण करतो जेणेकरून इतर कोणीही त्यांना बदलू शकणार नाही."

"दुसरा नाइट मरण पावला (HP = 0)"

"पहिल्या नाइटने 100 XP मिळवले."

"सर्व काही ठीक आहे असे दिसते, परंतु अशी परिस्थिती असू शकते जेव्हा दुसरा शूरवीर एकाच वेळी पहिल्यावर हल्ला करतो. ही पद्धत दुसऱ्या नाइटसाठी देखील म्हटले जाते, परंतु नाइट वस्तू वेगळ्या क्रमाने पार केल्या जातात."

"तुम्हाला म्हणायचे आहे की आम्हाला डेडलॉक मिळविण्यासाठी अनेक पद्धतींची आवश्यकता नाही?"

"बरोबर. काहीवेळा थ्रेड्स होण्यासाठी फक्त एक सोपी पद्धत लागते आणि संपूर्ण प्रोग्राम हँग होण्यासाठी."

"हो, मला वाटते की ही घटना माझ्या विचारापेक्षा जास्त वेळा घडते. धन्यवाद, एली."