কম্পিউটার টিউটোরিয়াল

জাভাতে ডেডলক এড়ানোর পদ্ধতি


জাভাতে, একটি ডেডলক হল এমন একটি প্রোগ্রামিং পরিস্থিতি যেখানে দুই বা ততোধিক থ্রেড চিরকাল ব্লক হয়ে থাকে। একটি ডেডলক কন্ডিশন অন্তত দুই থ্রেড এবং দুই বা ততোধিক রিসোর্স-এর সাথে ঘটে।

ডেডলক এড়ানোর উপায়

  • নেস্টেড লক এড়িয়ে চলুন: ডেডলক মূলত তখন ঘটে যখন আমরা একাধিক থ্রেডকে লক দিই। যদি ইতিমধ্যে একটিকে দিয়েছি তবে একাধিক থ্রেডকে লক দিতে থেকে পরিহার করুন।
  • অনাবশ্যক লক এড়িয়ে চলুন: আমরা শুধু সেই সদস্যদের লক করতে পারি যেগুলো প্রয়োজন। অনাবশ্যক লক রাখা ডেডলকের দিকে নিয়ে যেতে পারে।
  • Thread.join() ব্যবহার: একটি থ্রেড অন্যটি শেষ হওয়ার জন্য অপেক্ষা করলে ডেডলক কন্ডিশন দেখা দেয়। এই পরিস্থিতিতে আমরা এক্সিকিউশন যতক্ষণ সময় নেবে ততক্ষণ Thread.join() ব্যবহার করতে পারি।

উদাহরণ

public class DeadlockTest { 
    public static void main(String[] args) throws InterruptedException { 
        Object obj1 = new Object(); 
        Object obj2 = new Object(); 
        Object obj3 = new Object(); 
        Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1"); 
        Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2"); 
        t1.start(); 
        Thread.sleep(2000); 
        t2.start(); 
        Thread.sleep(2000); 
    } 
} 

class SyncThread implements Runnable { 
    private Object obj1; 
    private Object obj2; 
    
    public SyncThread(Object o1, Object o2){ 
        this.obj1 = o1; 
        this.obj2 = o2; 
    } 
    
    @Override 
    public void run() { 
        String name = Thread.currentThread().getName(); 
        System.out.println(name + " acquiring lock on " + obj1); 
        synchronized (obj1) { 
            System.out.println(name + " acquired lock on " + obj1); 
            work(); 
        } 
        System.out.println(name + " released lock on " + obj1); 
        System.out.println(name + " acquiring lock on " + obj2); 
        synchronized (obj2) { 
            System.out.println(name + " acquired lock on " + obj2); 
            work(); 
        } 
        System.out.println(name + " released lock on " + obj2); 
        System.out.println(name + " finished execution."); 
    } 
    
    private void work() { 
        try { 
            Thread.sleep(5000); 
        } catch (InterruptedException ie) { 
            ie.printStackTrace(); 
        } 
    } 
}

আউটপুট

t1 acquiring lock on java.lang.Object@917d8d4 t1 acquired lock on java.lang.Object@917d8d4 t2 acquiring lock on java.lang.Object@5c4b42fb t2 acquired lock on java.lang.Object@5c4b42fb t1 released lock on java.lang.Object@917d8d4 t1 acquiring lock on java.lang.Object@5c4b42fb t1 acquired lock on java.lang.Object@5c4b42fb t2 released lock on java.lang.Object@5c4b42fb t2 acquiring lock on java.lang.Object@528cb702 t2 acquired lock on java.lang.Object@528cb702 t1 released lock on java.lang.Object@5c4b42fb t2 released lock on java.lang.Object@528cb702 t1 finished execution. t2 finished execution.

  1. জাভাতে অটো-কমপ্লিট JComboBox বাস্তবায়ন করা

  2. জাভাতে রাউন্ডেড JTextField বাস্তবায়ন

  3. জাভাতে এডিটেবল JLabel কীভাবে বাস্তবায়ন করবেন?

  4. জাভাতে JToggleButton কীভাবে বাস্তবায়ন করবেন?