শেয়ার্ড রিসোর্সে একাধিক থ্রেড দ্বারা লক পাওয়ার দুটি পদ্ধতি রয়েছে: ReentrantLock (বা ReadWriteLock) এবং synchronized মেথড/ব্লক। ReentrantLock ক্লাস জাভা ৫ থেকে java.util.concurrent প্যাকেজে উপলব্ধ। এটি Lock ইন্টারফেসের ইমপ্লিমেন্টেশন এবং জাভা ডকস অনুযায়ী, Lock ইন্টারফেস synchronized মেথডের চেয়ে অধিক ব্যাপক অপারেশন প্রদান করে।
ReentrantLock এবং Synchronized-এর তুলনা
| ক্রমিক নং | বিষয় | ReentrantLock | Synchronized |
|---|---|---|---|
| ১ | লক অধিগ্রহণ | lock() মেথড ব্যবহার করে থ্রেড শেয়ার্ড রিসোর্সে লক পায় | synchronized কীওয়ার্ড লিখলেই লক পাওয়া যায় |
| ২ | লক মুক্তি | প্রোগ্রামারকে unlock() মেথড কল করতে হয় | অনুচ্ছেদ শেষ হলে অপরিহার্যভাবে মুক্তি পায় |
| ৩ | ইন্টারাপ্ট ক্ষমতা | lockInterruptibly() মেথড দিয়ে থ্রেড ইন্টারাপ্ট করা যায় | থ্রেড ইন্টারাপ্ট করার কোনো উপায় নেই |
| ৪ | ন্যায়সঙ্গতা (Fairness) | কনস্ট্রাক্টরে fairness প্যারামিটার থাকে। true হলে দীর্ঘসময় অপেক্ষা কর रहे থ্রেডকে প্রাধান্য দেয় | লক কোনো নির্দিষ্ট অ্যাক্সেস অর্ডার গ্যারান্টি দেয় না |
| ৫ | লক রিলিজ অর্ডার | যে কোনো ক্রমে লক রিলিজ করা যায় | লক অর্জনের ক্রমেই রিলিজ করতে হয় |
ReentrantLock উদাহরণ
public class ReentrantLockExample implements Runnable {
private Lock lock = new ReentrantLock();
@Override
public void run() {
try {
lock.lock();
// শেয়ার্ড রিসোর্স লক করা
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
Synchronized উদাহরণ
public class SynchronizedLockExample implements Runnable {
@Override
public void run() {
synchronized (resource) {
// শেয়ার্ড রিসোর্স লক করা
}
}
}
কোনটি ব্যবহার করবেন?
- Synchronized: সাদা লকিংয়ের জন্য, কোড ক্লিন রাখতে
- ReentrantLock: উন্নত ফিচার দরকার হলে (fairness, interruptibility, tryLock, condition variables)