शेयर्ड रिसोर्स पर मल्टीपल थ्रेड्स द्वारा लॉक प्राप्त करने के दो तरीके हैं: एक है ReentrantLock (या ReadWriteLock) और दूसरा है Synchronized मेथड का उपयोग करके।
ReentrantLock क्लास Java 5 से जावा कन्करेंसी पैकेज में प्रदान की गई है। यह Lock इंटरफेस का इम्प्लीमेंटेशन है और जावा डॉक्स के अनुसार, Lock इंटरफेस का इम्प्लीमेंटेशन synchronized मेथड की तुलना में अधिक व्यापक ऑपरेशन प्रदान करता है।
| क्र.सं. | मुख्य बिंदु | ReentrantLock | Synchronized |
|---|---|---|---|
| 1 | लॉक प्राप्त करना | ReentrantLock क्लास थ्रेड द्वारा शेयर्ड रिसोर्स पर लॉक पाने के लिए lock() मेथड प्रदान करती है | लॉक प्राप्त करने के लिए बस synchronized कीवर्ड लिखना होता है |
| 2 | लॉक रिलीज करना | लॉक रिलीज करने के लिए प्रोग्रामर को unlock() मेथड कॉल करना पड़ता है | यह इम्प्लिसिटली (अंतर्निहित रूप से) किया जाता है |
| 3 | इंटरप्ट करने की क्षमता | थ्रेड को इंटरप्ट करने के लिए lockInterruptibly() मेथड का उपयोग किया जा सकता है | थ्रेड को इंटरप्ट करने का कोई तरीका नहीं है |
| 4 | फेयरनेस | इस क्लास के कंस्ट्रक्टर में फेयरनेस पैरामीटर होता है। यदि इसे true पर सेट किया जाता है तो लॉक सबसे लंबे समय से वेट कर रहे थ्रेड को एक्सेस देने का पक्ष लेता है | लॉक किसी विशेष एक्सेस ऑर्डर की गारंटी नहीं देता |
| 5 | लॉक रिलीज ऑर्डर | लॉक को किसी भी ऑर्डर में रिलीज किया जा सकता है | लॉक को उसी ऑर्डर में रिलीज किया जाना चाहिए जिस क्रम में वे प्राप्त किए गए थे |
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: जब एडवांस्ड फीचर्स चाहिए जैसे फेयरनेस, टाइमआउट, इंटरप्टिबिलिटी, या मल्टीपल कंडीशन वेरिएबल्स