5

साथ ReentrantReadWriteLock निम्नलिखित ठेठ पाठक और लेखक पैटर्न (पढ़ता है की एक बहुत कुछ और कुछ राईट)जावा: प्राथमिकता

private ReadWriteLock lock = new ReentrantReadWriteLock(); 
    private int value; 

    public void writeValue(int newValue){ 
     lock.writeLock().lock(); 
     try{ 
      this.value = newValue; 
     } 
     finally{ 
      lock.writeLock().unlock(); 
     } 
    } 

    public int readValue(){ 
     lock.readLock().lock(); 
     try{ 
      return value; 
     } 
     finally{ 
      lock.writeLock().unlock(); 
     } 
    } 

मुझे लगता है कि सोच रहा हूँ है यह लेखक और पाठक को प्राथमिकता दी जाती है के लिए संभव है? उदाहरण के लिए, आम तौर पर लेखक बहुत लंबे समय तक प्रतीक्षा कर सकते हैं (शायद हमेशा के लिए) यदि अन्य थ्रेड द्वारा लगातार ताले पढ़ने वाले ताले होते हैं, तो क्या लेखक को उच्च प्राथमिकता के साथ रखना संभव है, इसलिए जब भी कोई लेखक आता है तो इसे माना जा सकता है उच्च प्राथमिकता (छोड़ें लाइन) कुछ ऐसा है।

उत्तर

4

javadoc के अनुसार, जेडीके कार्यान्वयन में कोई पाठक/लेखक प्राथमिकता नहीं है। हालांकि, यदि आप "निष्पक्ष" कार्यान्वयन का उपयोग करते हैं, तो लॉक फीफो ऑर्डर (अभी भी कोई पाठक/लेखक वरीयता नहीं) में दिया गया है, इसलिए कम से कम भविष्य के पाठक प्रतीक्षा लेखकों को अवरुद्ध नहीं करेंगे।

+0

क्या आपको लगता है कि इस समय अन्य अतिरिक्त समवर्ती संग्रह आवश्यक है? BlockingQueue की तरह? या समवर्ती PriortyQueue कुछ ऐसा है? – peter

+0

@ user1389813 - क्या फीफो ऑर्डरिंग आपकी आवश्यकताओं के लिए पर्याप्त पर्याप्त गारंटी नहीं है? इस बात पर विचार करते हुए कि पाठक (आपके उदाहरण में) केवल एक साधारण मूल्य पढ़ रहे हैं, मैं कल्पना नहीं कर सकता कि एक लेखक को मौजूदा पाठकों के लिए लंबे समय तक इंतजार करना होगा (जो एक साथ आगे बढ़ सकते हैं)। – jtahlborn

+0

तो आपका सुझाव क्या है? – peter

0

लिखें ताले वास्तव में पहले से ही पाठक ताले से पहले प्राथमिकता प्राप्त कर रहे हैं।

यदि कोई धागा संसाधन को पढ़ना चाहता है, तो यह तब तक ठीक है जब तक कोई धागा इसे लिख नहीं रहा हो, और कोई धागे ने संसाधन तक पहुंच पहुंचने का अनुरोध नहीं किया है। लेखन-पहुंच अनुरोधों को प्राथमिकता से प्राथमिकता देते हुए हम मानते हैं कि लेखन अनुरोध पढ़ने के अनुरोधों से अधिक महत्वपूर्ण हैं।

अधिक जानकारी के लिए कृपया this excellent post देखें।

संपादित करें: यह ध्यान रखना महत्वपूर्ण है कि यह fair mode only के लिए है। धन्यवाद @ jtahlborn!

+1

[javadoc] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html) के अनुसार: "यह वर्ग एक पाठक लागू नहीं करता है या लॉक एक्सेस के लिए लेखक वरीयता ऑर्डरिंग "। आपके द्वारा लिंक किया गया लेख एक अलग कार्यान्वयन है। – jtahlborn

+0

@jtahlborn कृपया पढ़ें: "एक धागा जो एक उचित रीड लॉक (गैर-बार-बार) प्राप्त करने का प्रयास करता है, तो अगर ब्लॉक लॉक हो या तो एक प्रतीक्षा लेखक थ्रेड हो।" – Vitaliy

+1

हाँ, _fair_ संस्करण के लिए, और यह _writer_ प्राथमिकता नहीं है। कृपया मेरा जवाब देखें। – jtahlborn

संबंधित मुद्दे