Java Academy · पाठ

Reader-Writer Scenarios के लिए ReadWriteLock

cache में exclusive writes सुनिश्चित करते हुए concurrent reads की अनुमति देने के लिए ReadWriteLock का उपयोग करें।

पाठ 2, कुल 4 में से13 चरण

Reader-Writer Scenarios के लिए ReadWriteLock, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

पठन-लेखन समस्या

कई थ्रेड साझा डेटा को एक साथ सुरक्षित रूप से पढ़ सकते हैं। लेकिन लिखने के लिए विशेष पहुँच आवश्यक होती है — एक साथ पढ़ना या लिखना नहीं हो सकता। ReadWriteLock इसे मॉडल करता है: कई समकालिक पाठक OR एक विशेष लेखक।

import java.util.concurrent.locks.*;

ReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock readLock  = rwLock.readLock();
Lock writeLock = rwLock.writeLock();

रीड lock: साझा पहुँच

कई थ्रेड एक साथ read lock धारण कर सकते हैं, बशर्ते किसी भी थ्रेड के पास write lock न हो:

class ReadableCache {
    private final Map<String, String> cache = new HashMap<>();
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    
    String get(String key) {
        lock.readLock().lock();
        try {
            return cache.get(key); // concurrent reads OK
        } finally {
            lock.readLock().unlock();
        }
    }
}

राइट lock: विशेष पहुँच

एक समय में केवल एक थ्रेड write lock धारण कर सकता है। लिखने के दौरान सभी पाठक और अन्य लेखक अवरुद्ध रहते हैं:

class WritableCache extends ReadableCache {
    private final ReadWriteLock wLock = new ReentrantReadWriteLock();
    private final Map<String, String> data = new HashMap<>();
    
    void put(String key, String value) {
        wLock.writeLock().lock();
        try {
            data.put(key, value); // exclusive write
        } finally {
            wLock.writeLock().unlock();
        }
    }
}

पूर्ण Cache उदाहरण

ऐसा थ्रेड-सुरक्षित कैश जिसमें पढ़ने की क्रियाएँ अधिक और लिखने की क्रियाएँ कम हों:

class Cache<K,V> {
    private final Map<K,V> map = new HashMap<>();
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    
    V get(K key) {
        lock.readLock().lock();
        try { return map.get(key); }
        finally { lock.readLock().unlock(); }
    }
    
    void put(K key, V value) {
        lock.writeLock().lock();
        try { map.put(key, value); }
        finally { lock.writeLock().unlock(); }
    }
    
    int size() {
        lock.readLock().lock();
        try { return map.size(); }
        finally { lock.readLock().unlock(); }
    }
}

lock को डाउनग्रेड करना

ReadWriteLock lock को डाउनग्रेड करने की सुविधा देता है: write lock प्राप्त करें → read lock प्राप्त करें → write lock छोड़ें। इससे थ्रेड lock छोड़े बिना विशेष लेखन से साझा पठन में बदल सकता है:

ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
Lock r = rwl.readLock(), w = rwl.writeLock();

w.lock(); // acquire write
try {
    // modify data
    r.lock(); // acquire read WHILE holding write
} finally {
    w.unlock(); // release write, now holding read only
}
try {
    // safely read the just-written data
} finally {
    r.unlock();
}

रीड lock को अपग्रेड नहीं किया जा सकता

Lock upgrading (read → write) समर्थित नहीं है। यदि read lock धारण करने वाला थ्रेड write lock प्राप्त करने का प्रयास करता है, तो डेडलॉक हो जाता है, क्योंकि write lock सभी पाठकों, जिसमें स्वयं वह थ्रेड भी शामिल है, के समाप्त होने की प्रतीक्षा करता है:

// DEADLOCK: Do NOT do this
lock.readLock().lock();
try {
    lock.writeLock().lock(); // DEADLOCK — waits for readLock to release
} finally {
    lock.readLock().unlock();
}

ReadWriteLock कब उपयोगी है

ReadWriteLock तब लाभदायक होता है, जब:

  • पढ़ने की क्रियाएँ लिखने की क्रियाओं से बहुत अधिक हों
  • पढ़ने की क्रियाओं में पर्याप्त समय लगता हो, जैसे जटिल क्वेरी में

जब लिखना बार-बार होता है (write lock सभी पाठकों को रोकता है) या क्रियाएँ बहुत तेज़ होती हैं (दो lock ऑब्जेक्ट का अतिरिक्त खर्च), तब यह प्रदर्शन को नुकसान पहुँचा सकता है।

ReadWriteLock की तुलना synchronized से

सिंक्रोनाइज़्ड/ReentrantLock → एक समय में केवल एक थ्रेड (एक साथ होने वाले पाठक भी अवरुद्ध)।
ReadWriteLock → कई समकालिक पाठक, एक विशेष लेखक। पढ़ने की अधिकता वाली स्थितियों में पढ़ने का बेहतर थ्रूपुट।

// synchronized: only one thread reads at a time
synchronized String get(String key) { return cache.get(key); }

// ReadWriteLock: many threads can read simultaneously
String get2(String key) {
    lock.readLock().lock();
    try { return cache.get(key); }
    finally { lock.readLock().unlock(); }
}

प्रदर्शन संबंधी विचार

दो lock ऑब्जेक्ट प्राप्त करने और छोड़ने से एक lock की तुलना में अतिरिक्त खर्च जुड़ता है। ReadWriteLock को तेज़ मानने से पहले प्रदर्शन मापें। लंबे समय वाली क्रियाओं और पढ़ने की अधिकता वाली स्थितियों में इसका लाभ स्पष्ट होता है। तेज़ और लिखने की अधिकता वाले कार्यभार में सरल ReentrantLock अधिक तेज़ हो सकता है।

ConcurrentHashMap का विकल्प

सरल मैप क्रियाओं के लिए ConcurrentHashMap अक्सर HashMap + ReadWriteLock से तेज़ होता है, क्योंकि इसमें आंतरिक खंड-स्तरीय lock होते हैं और वैश्विक प्रतिस्पर्धा नहीं होती:

// Often better than HashMap + ReadWriteLock for simple operations:
Map<String, String> concurrent = new ConcurrentHashMap<>();
concurrent.put("key", "value"); // thread-safe, no explicit lock
String v = concurrent.get("key"); // thread-safe

ReadLock की निष्पक्षता

डिफ़ॉल्ट रूप से, ReentrantReadWriteLock निष्पक्ष नहीं होता (पाठकों के कारण लेखकों की भुखमरी हो सकती है)। लेखकों की भुखमरी रोकने के लिए निष्पक्ष कंस्ट्रक्टर का उपयोग करें:

// Fair: waiting writers are served before new readers
ReentrantReadWriteLock fairLock = new ReentrantReadWriteLock(true);
System.out.println(fairLock.isFair()); // true

त्वरित जाँच

पढ़ने की अधिकता वाले अनुप्रयोग में, सरल synchronized विधि की तुलना में ReadWriteLock का मुख्य लाभ क्या है?

पुनरावलोकन: ReadWriteLock

मुख्य बातें:

  • कई समकालिक पठन OR एक विशेष लेखन — दोनों एक साथ नहीं
  • साझा पठन के लिए readLock.lock()/unlock()
  • विशेष लेखन के लिए writeLock.lock()/unlock()
  • lock को डाउनग्रेड करना समर्थित है; अपग्रेड करना (पठन→लेखन) डेडलॉक कराता है
  • पठन की अधिकता और पर्याप्त समय लेने वाली क्रियाओं के लिए सर्वोत्तम; सरल मैप के लिए ConcurrentHashMap
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

अक्सर पूछे जाने वाले प्रश्न

क्या “Reader-Writer Scenarios के लिए ReadWriteLock” पाठ निःशुल्क है?

हाँ—“Reader-Writer Scenarios के लिए ReadWriteLock” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Reader-Writer Scenarios के लिए ReadWriteLock” में मैं क्या सीखूँगा?

cache में exclusive writes सुनिश्चित करते हुए concurrent reads की अनुमति देने के लिए ReadWriteLock का उपयोग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“Reader-Writer Scenarios के लिए ReadWriteLock” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. ReentrantLock बनाम synchronized
  2. Reader-Writer Scenarios के लिए ReadWriteLock
  3. Atomic Variables: Lock-Free Updates
  4. StampedLock और Optimistic Reads
← Java Academy पर वापस जाएँ