ডেডলক ও এর কারণ- ১

"হাই, অ্যামিগো!"

"আজ আমি আপনাকে বলতে যাচ্ছি অচলাবস্থা কি।"

"আরে, আপনি ইতিমধ্যে আমাকে এরকম কিছু সম্পর্কে বলেছেন।"

"হ্যাঁ, আমি করেছি। কিন্তু আজ আমরা বিষয়টিকে আরও বিশদে বিবেচনা করব।"

"সরলতম ক্ষেত্রে, অচলাবস্থায় দুটি থ্রেড এবং দুটি মিউটেক্স বস্তু জড়িত। একটি পারস্পরিক লক ঘটে যখন:"

ক) প্রতিটি থ্রেড উভয় মিউটেক্স অর্জন করতে হবে।

খ)  প্রথম থ্রেডটি প্রথম মিউটেক্স অর্জন করেছে এবং দ্বিতীয়টি প্রকাশের জন্য অপেক্ষা করছে।

গ)  দ্বিতীয় থ্রেডটি দ্বিতীয় মিউটেক্স অর্জন করেছে এবং প্রথমটির মুক্তির জন্য অপেক্ষা করছে।

"এখানে কিছু উদাহরণঃ:

উদাহরণ
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 অর্জন করে।"

"এদিকে, একটি দ্বিতীয় থ্রেড অ্যাডফ্রেন্ড পদ্ধতিকে কল করে, বন্ধুদের অবজেক্টের মিউটেক্স অর্জন করে এবং তারপরে এই বস্তুর মিউটেক্সটি অর্জন করে ( getFriendsCount এ কল করার সময় )।"

"প্রথমে, সবকিছু ঠিকঠাক হবে, কিন্তু মারফির আইন অনুসারে: যেকোন কিছু যা ভুল হতে পারে তা ভুল হবে। একটি পরিস্থিতি অনিবার্যভাবে উদ্ভূত হবে যেখানে প্রথম থ্রেডের শুধুমাত্র একটি মিউটেক্স অর্জন করার সময় থাকবে এবং দ্বিতীয় থ্রেডটি দ্বিতীয়টি অর্জন করবে। মিউটেক্স ঠিক সেই মুহুর্তে। তারা এভাবেই ঝুলে থাকবে, চিরতরে মিউটেক্স ছেড়ে দেওয়ার জন্য অন্য থ্রেডের জন্য অপেক্ষা করবে।"

"আমি একটি বইতে পাওয়া আরেকটি সহজ উদাহরণ উদ্ধৃত করার সিদ্ধান্ত নিয়েছি:"

উদাহরণ
class KnightUtil
{
 public static void kill(Knight knight1, Knight knight2)
 {
  synchronized(knight1)
  {
   synchronized(knight2)
   {
    knight2.live = 0;
    knight1.experience += 100;
   }
  }
 }
}

"এমন একটি খেলা আছে যেখানে দুটি নাইট একে অপরের সাথে লড়াই করছে। একজন নাইট অন্যকে হত্যা করে। এই আচরণটি হত্যা পদ্ধতিতে প্রতিফলিত হয় । দুটি নাইট বস্তু এতে পাস করা হয়।

"প্রথম, আমরা উভয় বস্তুকে রক্ষা করি যাতে অন্য কেউ তাদের পরিবর্তন করতে না পারে।"

"দ্বিতীয় নাইট মারা যায় (HP = 0)"

"প্রথম নাইট 100 XP লাভ করে।"

"সবকিছু ঠিক আছে বলে মনে হচ্ছে, কিন্তু এমন পরিস্থিতি হতে পারে যেখানে দ্বিতীয় নাইট একই সময়ে প্রথমটিকে আক্রমণ করে। এই পদ্ধতিটিকে দ্বিতীয় নাইটের জন্যও বলা হয়, কিন্তু নাইট বস্তুগুলি ভিন্ন ক্রমে পাস করা হয়।"

"আপনি বলতে চাচ্ছেন যে অচলাবস্থা পেতে আমাদের একাধিক পদ্ধতির প্রয়োজন নেই?"

"ঠিক আছে। কখনও কখনও থ্রেড তৈরি করতে শুধুমাত্র একটি সহজ পদ্ধতি লাগে এবং পুরো প্রোগ্রামটি হ্যাং হয়ে যায়।"

"হ্যাঁ, আমি অনুমান করি যে এই ঘটনাটি আমি যতটা ভেবেছিলাম তার থেকে প্রায়ই ঘটে। ধন্যবাদ, এলি।"