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

জাভাতে অবজেক্ট লেভেল লক এবং ক্লাস লেভেল লকের পার্থক্য


অবজেক্ট লেভেল লক এবং ক্লাস লেভেল লক উভয়ই মাল্টি-থ্রেডেড অ্যাপ্লিকেশনে সিঙ্ক্রোনাইজেশন মেকানিজম অর্জনের জন্য ব্যবহৃত হয়।

অবজেক্ট লেভেল লক

জাভাতে প্রতিটি অবজেক্টের একটি ইউনিক লক থাকে। যদি কোনো থ্রেড কোনো প্রদত্ত অবজেক্টের উপর সিঙ্ক্রোনাইজড মেথড এক্সিকিউট করতে চায়, তবে প্রথমে সেটি অবজেক্টটির লক পেতে হবে। একবার থ্রেড লক পেলে সেটি সেই অবজেক্টের যেকোনো সিঙ্ক্রোনাইজড মেথড এক্সিকিউট করতে পারবে। মেথড এক্সিকিউশন সম্পন্ন হলে থ্রেড স্বয়ংক্রিয়ভাবে লক রিলিজ করে দেয়। লক অর্জন এবং রিলিজ আंतरিকভাবে JVM দ্বারা পরিচালিত হয়। অবজেক্ট লেভেল লক হল এমন একটি মেকানিজম যখন আমরা একটি নন-স্ট্যাটিক মেথড বা নন-স্ট্যাটিক কোড ব্লক সিঙ্ক্রোনাইজ করতে চাই যাতে একটি ক্লাসের প্রদত্ত ইনস্ট্যান্সে শুধু একটি থ্রেড কোড ব্লক এক্সিকিউট করতে পারে। এটি সবসময় ইনস্ট্যান্স-লেভেল ডেটা থ্রেড-সেফ করার জন্য করা হয়।

উদাহরণ

public class ObjectLevelLockTest implements Runnable { 
    @Override 
    public void run() { 
        objectLock(); 
    } 
    
    public void objectLock() { 
        System.out.println(Thread.currentThread().getName()); 
        synchronized(this) { 
            System.out.println("Synchronized block " + Thread.currentThread().getName()); 
            System.out.println("Synchronized block " + Thread.currentThread().getName() + " end"); 
        } 
    } 
    
    public static void main(String[] args) { 
        ObjectLevelLockTest test1 = new ObjectLevelLockTest(); 
        Thread t1 = new Thread(test1); 
        Thread t2 = new Thread(test1); 
        ObjectLevelLockTest test2 = new ObjectLevelLockTest(); 
        Thread t3 = new Thread(test2); 
        t1.setName("t1"); 
        t2.setName("t2"); 
        t3.setName("t3"); 
        t1.start(); 
        t2.start(); 
        t3.start(); 
    } 
}

আউটপুট

t1 t2 t3 Synchronized block t1 Synchronized block t3 Synchronized block t1 end Synchronized block t3 end Synchronized block t2 Synchronized block t2 end

ক্লাস লেভেল লক

জাভাতে প্রতিটি ক্লাসের একটি ইউনিক লক থাকে যা কোনদিন ক্লাস লেভেল লক। যদি কোনো থ্রেড একটি স্ট্যাটিক সিঙ্ক্রোনাইজড মেথড এক্সিকিউট করতে চায়, তবে থ্রেডের ক্লাস লেভেল লক প্রয়োজন। একবার থ্রেড ক্লাস লেভেল লক পেলে, সেটি সেই ক্লাসের যেকোনো স্ট্যাটিক সিঙ্ক্রোনাইজড মেথড এক্সিকিউট করতে পারবে। মেথড এক্সিকিউশন সম্পন্ন হলে থ্রেড স্বয়ংক্রিয়ভাবে লক রিলিজ করে দেয়। ক্লাস লেভেল লক একাধিক থ্রেডকে রানটাইমে উপলব্ধ সমস্ত ইনস্ট্যান্সে যেকোনো সিঙ্ক্রোনাইজড ব্লকে প্রবেশ করতে বাধা দেয়।

উদাহরণ

public class ClassLevelLockTest implements Runnable { 
    @Override 
    public void run() { 
        classLock(); 
    } 
    
    public void classLock() { 
        System.out.println(Thread.currentThread().getName()); 
        synchronized(ClassLevelLockTest.class) { 
            System.out.println("Synchronized block " + Thread.currentThread().getName()); 
            System.out.println("Synchronized block " + Thread.currentThread().getName() + " end"); 
        } 
    } 
    
    public static void main(String[] args) { 
        ClassLevelLockTest test1 = new ClassLevelLockTest(); 
        Thread t1 = new Thread(test1); 
        Thread t2 = new Thread(test1); 
        ClassLevelLockTest test2 = new ClassLevelLockTest(); 
        Thread t3 = new Thread(test2); 
        t1.setName("t1"); 
        t2.setName("t2"); 
        t3.setName("t3"); 
        t1.start(); 
        t2.start(); 
        t3.start(); 
    } 
}

আউটপুট

t3 t2 t1 Synchronized block t3 Synchronized block t3 end Synchronized block t2 Synchronized block t2 end Synchronized block t1 Synchronized block t1 end

  1. জাভাতে SwingWorker ক্লাসের গুরুত্ব কী?

  2. জাভাতে SwingUtilities ক্লাসের গুরুত্ব কী?

  3. জাভাতে ফাইনাল ক্লাস

  4. জাভাতে সিঙ্গেল লেভেল ইনহেরিট্যান্স