Reentrant Locks এবং Lock Interface

Synchronization এবং Locks - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

432

ReentrantLock এবং Lock ইন্টারফেস জাভাতে উন্নত লকিং মেকানিজম সরবরাহ করে, যা থ্রেড সিঙ্ক্রোনাইজেশনের জন্য আরও নমনীয়তা প্রদান করে। এগুলি সাধারণ synchronized ব্লকের বিকল্প হিসাবে ব্যবহৃত হয়।


১. ReentrantLock কি?

ReentrantLock একটি ক্লাস যা Lock ইন্টারফেসের অংশ এবং এটি মাল্টি-থ্রেডেড অ্যাপ্লিকেশনের জন্য একটি উন্নত লকিং কৌশল প্রদান করে। এটি নিম্নলিখিত বৈশিষ্ট্যগুলো সরবরাহ করে:

  • একটি থ্রেড একাধিকবার লক করতে পারে।
  • সময় সীমা নির্ধারণ করে লক করার চেষ্টা করা যায়।
  • লক করার চেষ্টা ব্যর্থ হলে থ্রেড ওয়েট করতে পারে না।
  • লক অবস্থা পরীক্ষা করার সুবিধা দেয়।

২. Lock Interface-এর গুরুত্বপূর্ণ মেথড

মেথডবর্ণনা
lock()লক অর্জন করে এবং অন্য থ্রেডগুলিকে ব্লক করে।
unlock()লক মুক্ত করে, অন্য থ্রেড লক অর্জন করতে পারে।
tryLock()লক করার চেষ্টা করে; সফল হলে true ফেরত দেয়, অন্যথায় false
tryLock(timeout, unit)নির্দিষ্ট সময়ের জন্য লক করার চেষ্টা করে।
lockInterruptibly()থ্রেড লক করতে অপেক্ষা করে কিন্তু ইন্টারাপ্ট হতে পারে।

৩. ReentrantLock-এর উদাহরণ

সাধারণ ব্যবহার

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private final Lock lock = new ReentrantLock();
    private int counter = 0;

    public void increment() {
        lock.lock(); // লক অর্জন
        try {
            counter++;
            System.out.println(Thread.currentThread().getName() + " - Counter: " + counter);
        } finally {
            lock.unlock(); // লক মুক্ত
        }
    }

    public static void main(String[] args) {
        ReentrantLockExample example = new ReentrantLockExample();

        Runnable task = example::increment;

        Thread thread1 = new Thread(task, "Thread-1");
        Thread thread2 = new Thread(task, "Thread-2");

        thread1.start();
        thread2.start();
    }
}

tryLock() ব্যবহার

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TryLockExample {
    private final Lock lock = new ReentrantLock();
    private int counter = 0;

    public void increment() {
        if (lock.tryLock()) { // লক করার চেষ্টা
            try {
                counter++;
                System.out.println(Thread.currentThread().getName() + " - Counter: " + counter);
            } finally {
                lock.unlock();
            }
        } else {
            System.out.println(Thread.currentThread().getName() + " - Could not acquire lock");
        }
    }

    public static void main(String[] args) {
        TryLockExample example = new TryLockExample();

        Runnable task = example::increment;

        Thread thread1 = new Thread(task, "Thread-1");
        Thread thread2 = new Thread(task, "Thread-2");

        thread1.start();
        thread2.start();
    }
}

tryLock(timeout, unit) ব্যবহার

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TryLockWithTimeoutExample {
    private final Lock lock = new ReentrantLock();
    private int counter = 0;

    public void increment() {
        try {
            if (lock.tryLock(1, TimeUnit.SECONDS)) { // নির্দিষ্ট সময়ের জন্য লক করার চেষ্টা
                try {
                    counter++;
                    System.out.println(Thread.currentThread().getName() + " - Counter: " + counter);
                } finally {
                    lock.unlock();
                }
            } else {
                System.out.println(Thread.currentThread().getName() + " - Could not acquire lock within timeout");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TryLockWithTimeoutExample example = new TryLockWithTimeoutExample();

        Runnable task = example::increment;

        Thread thread1 = new Thread(task, "Thread-1");
        Thread thread2 = new Thread(task, "Thread-2");

        thread1.start();
        thread2.start();
    }
}

৪. ReentrantLock-এর গুরুত্বপূর্ণ বৈশিষ্ট্য

  1. Interruptible Locking:
    lockInterruptibly() ব্যবহার করে একটি থ্রেড ব্লক থাকা অবস্থায় ইন্টারাপ্ট করা যায়।
  2. Condition Objects:
    ReentrantLock মাল্টিপল কন্ডিশন অবজেক্ট সাপোর্ট করে, যা synchronized ব্লকের তুলনায় উন্নত।

Condition ব্যবহার উদাহরণ

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ConditionExample {
    private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();
    private boolean ready = false;

    public void producer() throws InterruptedException {
        lock.lock();
        try {
            System.out.println("Producer waiting...");
            while (!ready) {
                condition.await(); // ওয়েট
            }
            System.out.println("Producer done");
        } finally {
            lock.unlock();
        }
    }

    public void consumer() throws InterruptedException {
        lock.lock();
        try {
            Thread.sleep(1000);
            ready = true;
            System.out.println("Consumer signal...");
            condition.signal(); // সিগন্যাল
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ConditionExample example = new ConditionExample();

        Thread producerThread = new Thread(() -> {
            try {
                example.producer();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread consumerThread = new Thread(() -> {
            try {
                example.consumer();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producerThread.start();
        consumerThread.start();
    }
}

৫. ReentrantLock বনাম synchronized

বৈশিষ্ট্যReentrantLocksynchronized
লক রিলিজলক ম্যানুয়ালি মুক্ত করতে হয়।স্বয়ংক্রিয়ভাবে মুক্ত হয়।
Interruptibleলক ইন্টারাপ্ট করা সম্ভব।ইন্টারাপ্ট করা যায় না।
Try Lockলক পাওয়ার চেষ্টা করা যায়।এই বৈশিষ্ট্য নেই।
Multiple Conditionsএকাধিক কন্ডিশন অবজেক্ট তৈরি করা যায়।একটি মনিটর প্রতি একটি কন্ডিশন।

  • ReentrantLock ব্যবহার করে উন্নত লকিং কৌশল অর্জন করা যায়।
  • Lock Interface কাস্টমাইজড থ্রেড সিঙ্ক্রোনাইজেশন নিশ্চিত করে।
  • ReentrantLock ব্যবহার করার সময় finally ব্লকে unlock() নিশ্চিত করতে হবে।

এই উদাহরণ এবং বৈশিষ্ট্যগুলোর সাহায্যে মাল্টি-থ্রেডিং অ্যাপ্লিকেশনের জন্য জাভা কনকারেন্সি আরও সহজ এবং কার্যকর হয়ে উঠবে।

Content added By
Promotion

Are you sure to start over?

Loading...