Deadlock কি এবং কিভাবে এটি প্রতিরোধ করা যায়?

Multithreading এবং Concurrency - জাভা ইন্টারভিউ প্রশ্ন (Java Interview Questions) - Java Technologies

942

Deadlock কী?

ডেডলক (Deadlock) হল একটি পরিস্থিতি যেখানে দুই বা ততোধিক থ্রেড একে অপরের উপর নির্ভরশীল হয়ে একে অপরের সম্পদ (resources) আবদ্ধ করে ফেলে, এবং এই কারণে তারা একে অপরকে মুক্তি দিতে পারে না। এর ফলে থ্রেডগুলি একে অপরকে অপেক্ষা করতে বাধ্য হয় এবং কোন কাজ সম্পাদন করতে পারে না।

ডেডলকের ঘটনার জন্য তিনটি শর্ত পূর্ণ হওয়া প্রয়োজন:

  1. Mutual Exclusion: অন্তত একটি সম্পদ (resource) এক সময় একটিমাত্র থ্রেডের দ্বারা ব্যবহার করা যেতে পারে।
  2. Hold and Wait: এক থ্রেড একটি সম্পদ ধারণ করে রেখেছে এবং অন্য সম্পদের জন্য অপেক্ষা করছে।
  3. No Preemption: থ্রেড থেকে কোন সম্পদ কৌশলে কেড়ে নেয়া যাবে না, থ্রেড নিজে সেই সম্পদটি মুক্ত করবে।
  4. Circular Wait: একাধিক থ্রেডের মধ্যে একটি চক্র সৃষ্টি হয়, যেখানে এক থ্রেড অন্য থ্রেডের সম্পদ ধরে রেখেছে এবং সেই থ্রেডটি আবার অন্য থ্রেডের সম্পদে আটকে আছে।

Deadlock এর উদাহরণ:

class A {
    synchronized void methodA(B b) {
        System.out.println("Thread 1: Locked A");
        b.last();
    }

    synchronized void last() {
        System.out.println("Inside A's last method");
    }
}

class B {
    synchronized void methodB(A a) {
        System.out.println("Thread 2: Locked B");
        a.last();
    }

    synchronized void last() {
        System.out.println("Inside B's last method");
    }
}

public class DeadlockExample {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();

        // Thread 1
        new Thread() {
            public void run() {
                a.methodA(b);
            }
        }.start();

        // Thread 2
        new Thread() {
            public void run() {
                b.methodB(a);
            }
        }.start();
    }
}

এখানে, প্রথম থ্রেড A ক্লাসের methodA() মেথডে B ক্লাসের last() মেথড কল করার জন্য আটকেছে, এবং দ্বিতীয় থ্রেড B ক্লাসের methodB() মেথডে A ক্লাসের last() মেথড কল করতে গিয়ে আটকে আছে। এই পরিস্থিতি ডেডলক তৈরি করে।

Deadlock প্রতিরোধের উপায়:

ডেডলক প্রতিরোধে কয়েকটি কৌশল ব্যবহার করা যেতে পারে:

  1. লক অর্ডার (Lock Ordering):
    • সব থ্রেডদের জন্য একটি নির্দিষ্ট লক অর্ডার নির্ধারণ করুন। এর মাধ্যমে, যখন একাধিক লক প্রয়োজন হয়, তখন থ্রেডগুলো পূর্বনির্ধারিত অর্ডারে লক করবে, যাতে ডেডলক এড়ানো যায়।
    • উদাহরণ: প্রথমে A লক করুন এবং তারপর B লক করুন। আরেকটি থ্রেড প্রথমে A না নিয়ে B নিয়ে অপেক্ষা করবে না।
  2. টাইট টাইম আউট (Timeout) ব্যবহার করুন:
    • আপনি ReentrantLock ব্যবহার করলে, tryLock() মেথডের মাধ্যমে নির্দিষ্ট সময়ের জন্য লক চেষ্টা করতে পারেন। যদি লক না পাওয়া যায়, তখন থ্রেডটি পুনরায় চেষ্টা করতে পারে বা অন্য কোন ব্যবস্থা নিতে পারে।
    • উদাহরণ:

      Lock lock1 = new ReentrantLock();
      Lock lock2 = new ReentrantLock();
      
      boolean lock1Acquired = lock1.tryLock();
      boolean lock2Acquired = lock2.tryLock();
      
      if (lock1Acquired && lock2Acquired) {
          // Both locks acquired
      } else {
          // Release the locks and retry
      }
      
  3. লক মুক্তি (Lock Release) নিশ্চিত করা:
    • finally ব্লক ব্যবহার করুন যাতে থ্রেড সম্পদ ব্যবহারের পর লক মুক্ত করতে পারে, এটি নিশ্চিত করে যে কোনো থ্রেড লক ধরে না রেখে ব্লক থেকে বেরিয়ে যাবে।
  4. ডেডলক ডিটেকশন (Deadlock Detection):
    • থ্রেডগুলির মধ্যে ডেডলক ডিটেকশন মেকানিজম তৈরি করা যায়, যেখানে থ্রেডগুলো কিছু সময় পর চেক করবে যে তারা কোন থ্রেডের কাছে আটকে রয়েছে কিনা এবং থ্রেডটি নিজেদের কাজ করার জন্য নিজস্ব লক ফেরত দেবে।
  5. অর্থাৎ, ডেডলক প্রতিরোধের জন্য থ্রেডে প্রয়োগযোগ্য কিছু শর্ত:
    • No Circular Wait: এটি নিশ্চিত করতে থ্রেডগুলির মধ্যে অর্ডার থাকতে হবে।
    • No Hold and Wait: থ্রেড যদি একাধিক সম্পদ নিয়ে কাজ করতে থাকে, তবে একে একে সমস্ত সম্পদ গ্রহণ করতে হবে।
    • Preemption: অন্যথায়, যদি থ্রেড এক বা একাধিক সম্পদে আটকে থাকে, তবে সেই সম্পদ অন্য থ্রেডের কাছে স্থানান্তরিত করা উচিত।

Deadlock Avoidance এবং Detection:

  1. Deadlock Avoidance:
    • Banker's Algorithm ব্যবহার করে সিস্টেমে থ্রেডগুলির জন্য লক অর্জন করতে সীমিত রিসোর্সগুলো বিতরণ করতে পারে।
  2. Deadlock Detection:
    • থ্রেড চলাকালে, যদি একটি ডেডলক শনাক্ত হয়, তবে সিস্টেমটি এক বা একাধিক থ্রেডকে বাতিল করে এবং থ্রেডগুলো পুনরায় শুরু করতে পারে।

ডেডলক একটি গুরুতর সমস্যা হতে পারে যদি এটি সঠিকভাবে পরিচালিত না হয়, কিন্তু কিছু কৌশল এবং নীতি প্রয়োগের মাধ্যমে এটি প্রতিরোধ করা সম্ভব। সঠিক লক অর্ডার, টাইট টাইম আউট, লক মুক্তি এবং ডেডলক ডিটেকশন কৌশল ব্যবহার করে আপনি আপনার জাভা প্রোগ্রামে ডেডলক থেকে বিরত থাকতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...