ReentrantLock बनाम synchronized
ReentrantLock की सुविधाओं (tryLock, lockInterruptibly, fairness) की synchronized keyword से तुलना करें।
ReentrantLock बनाम synchronized, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
synchronized कीवर्ड
Java का synchronized कीवर्ड ऑब्जेक्ट के अंतर्निहित lock (मॉनिटर) का उपयोग करके पारस्परिक बहिष्करण प्रदान करता है। यह सरल है, लेकिन सीमित — इसमें समय-सीमा, निष्पक्षता और व्यवधान-क्षमता नहीं होती।
class Counter {
private int count = 0;
synchronized void increment() {
count++; // only one thread at a time
}
synchronized int get() { return count; }
}
Counter c = new Counter();
// Multiple threads can safely call increment()ReentrantLock की मूल बातें
ReentrantLock, java.util.concurrent.locks से मिलने वाला एक स्पष्ट lock है। यह synchronized के समान पारस्परिक बहिष्करण प्रदान करता है, लेकिन अधिक नियंत्रण देता है। lock को finally ब्लॉक में मैन्युअल रूप से छोड़ना आवश्यक है।
import java.util.concurrent.locks.*;
class SafeCounter {
private int count = 0;
private final ReentrantLock lock = new ReentrantLock();
void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock(); // always release in finally!
}
}
int get() {
lock.lock();
try { return count; }
finally { lock.unlock(); }
}
}tryLock: बिना अवरोध अधिग्रहण
tryLock() बिना अवरोध के lock प्राप्त करने का प्रयास करता है। सफल होने पर सत्य लौटाता है; यदि lock किसी अन्य थ्रेड के पास हो, तो असत्य लौटाता है।
ReentrantLock lock = new ReentrantLock();
if (lock.tryLock()) {
try {
System.out.println("Got the lock, doing work");
} finally {
lock.unlock();
}
} else {
System.out.println("Lock busy, skipping or retrying");
}समय-सीमा के साथ tryLock
lock प्राप्त करने के लिए निर्दिष्ट समय तक प्रतीक्षा करें:
try {
if (lock.tryLock(500, TimeUnit.MILLISECONDS)) {
try {
// work with protected resource
System.out.println("Acquired within 500ms");
} finally {
lock.unlock();
}
} else {
System.out.println("Timed out waiting for lock");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}lockInterruptibly
lockInterruptibly() तब तक lock प्राप्त करता है, जब तक थ्रेड में व्यवधान न डाला जाए — lock की प्रतीक्षा कर रहे रद्द किए जा सकने वाले कार्यों के लिए उपयोगी:
try {
lock.lockInterruptibly(); // throws InterruptedException if interrupted
try {
// do work
} finally {
lock.unlock();
}
} catch (InterruptedException e) {
System.out.println("Interrupted while waiting for lock");
Thread.currentThread().interrupt();
}पुनःप्रवेश क्षमता
synchronized और ReentrantLock दोनों पुनःप्रवेशी हैं — जो थ्रेड पहले से lock धारण करता है, वह डेडलॉक के बिना इसे फिर से प्राप्त कर सकता है:
synchronized void outer() {
System.out.println("outer");
inner(); // same thread re-enters — OK
}
synchronized void inner() {
System.out.println("inner"); // same lock, same thread
}
// ReentrantLock:
ReentrantLock lock = new ReentrantLock();
lock.lock();
lock.lock(); // acquire again — hold count = 2
lock.unlock(); // hold count = 1
lock.unlock(); // hold count = 0, lock releasedनिष्पक्षता नीति
FIFO क्रम में पहुँच देने के लिए निष्पक्ष ReentrantLock बनाएँ — इससे थ्रेड की भुखमरी रुकती है, लेकिन थ्रूपुट कम हो जाता है:
// Unfair (default): no ordering guarantee, better throughput
ReentrantLock unfair = new ReentrantLock();
// Fair: threads acquire in arrival order
ReentrantLock fair = new ReentrantLock(true);
System.out.println(fair.isFair()); // trueकंडीशन चर
ReentrantLock Condition ऑब्जेक्ट प्रदान करता है — ये wait()/notify() से अधिक लचीले होते हैं:
ReentrantLock lock2 = new ReentrantLock();
Condition notEmpty = lock2.newCondition();
Queue<String> queue = new LinkedList<>();
// Producer
lock2.lock();
try {
queue.offer("item");
notEmpty.signal(); // wake one waiting thread
} finally { lock2.unlock(); }
// Consumer
lock2.lock();
try {
while (queue.isEmpty()) notEmpty.await(); // wait & release lock
System.out.println(queue.poll());
} finally { lock2.unlock(); }ReentrantLock बनाम synchronized का उपयोग कब करें
synchronized का उपयोग करें, जब:
- सरल पारस्परिक बहिष्करण की आवश्यकता हो
- समय-सीमा, निष्पक्षता या व्यवधान-क्षमता की आवश्यकता न हो
ReentrantLock का उपयोग करें, जब:
- tryLock() या tryLock(timeout) की आवश्यकता हो
- lockInterruptibly() की आवश्यकता हो
- निष्पक्ष क्रम आवश्यक हो
- कई Condition चर आवश्यक हों
lock की संख्या और निगरानी
ReentrantLock नैदानिक विधियाँ प्रदान करता है:
ReentrantLock lock3 = new ReentrantLock();
lock3.lock();
lock3.lock(); // reentrant — hold count 2
System.out.println(lock3.getHoldCount()); // 2
System.out.println(lock3.isHeldByCurrentThread()); // true
System.out.println(lock3.isLocked()); // true
System.out.println(lock3.getQueueLength()); // 0 (no waiting threads)
lock3.unlock();
lock3.unlock(); // fully releasedसामान्य गलती: lock लिए बिना unlock करना
जब वर्तमान थ्रेड के पास lock न हो, तब unlock() कॉल करने पर IllegalMonitorStateException उत्पन्न होता है। हमेशा lock और unlock को जोड़ी में रखें या try-finally का उपयोग करें:
ReentrantLock lock4 = new ReentrantLock();
try {
// If lock() is never called (e.g., skipped by exception before this line)
lock4.unlock(); // throws IllegalMonitorStateException
} catch (IllegalMonitorStateException e) {
System.out.println("Must lock before unlock!");
}त्वरित जाँच
ReentrantLock की कौन-सी विधि किसी थ्रेड को lock प्राप्त करने देती है या lock उपलब्ध न होने पर बिना अवरोध के तुरंत वापस लौटती है?
पुनरावलोकन: ReentrantLock बनाम synchronized
मुख्य बातें:
- दोनों पारस्परिक बहिष्करण और पुनःप्रवेश क्षमता प्रदान करते हैं
- ReentrantLock अतिरिक्त सुविधाएँ देता है: tryLock, lockInterruptibly, निष्पक्षता और Conditions
- हमेशा finally ब्लॉक में lock छोड़ें
- synchronized सरल है — जब इसकी सुविधाएँ पर्याप्त हों, तो इसे प्राथमिकता दें
- उन्नत स्थितियों के लिए ReentrantLock: समय-सीमाएँ, व्यवधान-क्षमता और कई conditions
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “ReentrantLock बनाम synchronized” पाठ निःशुल्क है?
हाँ—“ReentrantLock बनाम synchronized” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“ReentrantLock बनाम synchronized” में मैं क्या सीखूँगा?
ReentrantLock की सुविधाओं (tryLock, lockInterruptibly, fairness) की synchronized keyword से तुलना करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“ReentrantLock बनाम synchronized” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- ReentrantLock बनाम synchronized
- Reader-Writer Scenarios के लिए ReadWriteLock
- Atomic Variables: Lock-Free Updates
- StampedLock और Optimistic Reads