गतिरोध और उसके कारण - 1

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

"आज मैं आपको बताने जा रहा हूँ कि गतिरोध क्या है।"

"अरे, आपने मुझे पहले ही ऐसा कुछ बताया है।"

"हाँ, मैंने किया था। लेकिन आज हम इस विषय पर अधिक विस्तार से विचार करेंगे।"

"सबसे सरल मामले में, डेडलॉक में दो धागे और दो म्यूटेक्स ऑब्जेक्ट शामिल होते हैं। एक पारस्परिक लॉक तब होता है जब:"

ए) प्रत्येक थ्रेड को दोनों म्यूटेक्स प्राप्त करने की आवश्यकता होती है।

बी)  पहले धागे ने पहले म्यूटेक्स का अधिग्रहण किया है और दूसरे के रिलीज होने का इंतजार कर रहा है।

सी)  दूसरे धागे ने दूसरे म्यूटेक्स का अधिग्रहण किया है और पहले रिलीज होने की प्रतीक्षा कर रहा है।

"यहां कुछ उदाहरण दिए गए हैं:

उदाहरण
 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 विधि को कॉल करता है, इस ऑब्जेक्ट के म्यूटेक्स को प्राप्त करता है, और उसके बाद फ्रेंड्स ऑब्जेक्ट के म्यूटेक्स को प्राप्त करता है।"

"इस बीच, एक दूसरा थ्रेड ऐडफ्रेंड विधि को कॉल करता है, फ्रेंड्स ऑब्जेक्ट के म्यूटेक्स को प्राप्त करता है, और फिर इस ऑब्जेक्ट के म्यूटेक्स को प्राप्त करता है (कॉल के दौरान getFriendsCount )।"

"सबसे पहले, सब कुछ ठीक हो जाएगा, लेकिन जैसा कि मर्फी का कानून कहता है: जो कुछ भी गलत हो सकता है वह गलत हो जाएगा। ऐसी स्थिति अनिवार्य रूप से उत्पन्न होगी जहां पहले धागे के पास केवल एक म्यूटेक्स प्राप्त करने का समय होगा, और दूसरा धागा दूसरे का अधिग्रहण करेगा म्युटेक्स उसी क्षण।

"मैंने एक किताब में मिले एक और सरल उदाहरण को उद्धृत करने का फैसला किया है:"

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

"एक खेल है जहाँ दो शूरवीर एक दूसरे से लड़ रहे हैं। एक शूरवीर दूसरे को मारता है। यह व्यवहार मार विधि में परिलक्षित होता है। इसमें दो शूरवीर वस्तुएँ दी जाती हैं।

"सबसे पहले, हम दोनों वस्तुओं की रक्षा करते हैं ताकि कोई और उन्हें बदल न सके।"

"दूसरा नाइट मर जाता है (एचपी = 0)"

"पहला शूरवीर 100 XP प्राप्त करता है।"

"सब कुछ ठीक लगता है, लेकिन ऐसी स्थितियाँ हो सकती हैं जहाँ दूसरा शूरवीर पहले पर उसी समय हमला करता है। इस विधि को दूसरे शूरवीर के लिए भी कहा जाता है, लेकिन शूरवीर वस्तुओं को एक अलग क्रम में पारित किया जाता है।"

"आपका मतलब है कि डेडलॉक प्राप्त करने के लिए हमें कई तरीकों की भी आवश्यकता नहीं है?"

"ठीक है। कभी-कभी थ्रेड्स और पूरे प्रोग्राम को हैंग करने के लिए केवल एक सरल विधि की आवश्यकता होती है।"

"हाँ, मुझे लगता है कि यह घटना मेरे विचार से कहीं अधिक बार घटित होती है। धन्यवाद, ऐली।"