नहीं, विधियों को सिंक्रनाइज़ करने की आवश्यकता नहीं है, और आपको किसी भी तरीके को परिभाषित करने की आवश्यकता नहीं है; वे पहले से ही समवर्ती लिपि क्यू में हैं, बस उनका उपयोग करें। ConcurrentLinkedQueue उन सभी लॉकिंग और अन्य ऑपरेशनों को करता है जिनकी आपको आंतरिक आवश्यकता होती है; आपका निर्माता (s) कतार में डेटा जोड़ता है, और आपके उपभोक्ता इसके लिए मतदान करते हैं।
सबसे पहले, अपनी कतार बनाएं:
Queue<YourObject> queue = new ConcurrentLinkedQueue<YourObject>();
अब, जहाँ भी आप अपने निर्माता / उपभोक्ता वस्तुओं का निर्माण कर रहे हैं, कतार में गुज़ारें ताकि उनके पास अपनी वस्तुएं रखने के लिए कहीं न कहीं (आप इसके लिए एक सेटर का उपयोग कर सकें, बल्कि मैं इस तरह की चीज़ को एक निर्माता में करना पसंद करता हूँ):
YourProducer producer = new YourProducer(queue);
तथा:
YourConsumer consumer = new YourConsumer(queue);
और अपने निर्माता में इसके लिए सामान जोड़ें:
queue.offer(myObject);
और अपने उपभोक्ता में सामान निकाल लें (यदि कतार खाली है, तो पोल () शून्य हो जाएगा, इसलिए इसे देखें):
YourObject myObject = queue.poll();
अधिक जानकारी के लिए Javadoc देखें
संपादित करें:
यदि आपको कतार के खाली होने की प्रतीक्षा में ब्लॉक करने की आवश्यकता है, तो आप संभवतः एक लिंक्डब्लॉकिंग क्यू का उपयोग करना चाहते हैं , और ले () विधि का उपयोग कर सकते हैं। हालाँकि, LinkedBlockingQueue की अधिकतम क्षमता (Integer.MAX_VALUE के लिए डिफ़ॉल्ट है, जो दो बिलियन से अधिक है) और इस प्रकार आपकी परिस्थितियों के आधार पर उपयुक्त हो सकती है या नहीं भी।
यदि आपके पास केवल एक धागा है जो कतार में सामान रख रहा है, और दूसरा धागा कतार से बाहर सामान ले जा रहा है, तो ConcurrentLinkedQueue संभवतः ओवरकिल है। जब आप सैकड़ों या हजारों धागे एक ही समय में कतार में पहुंच सकते हैं तो यह अधिक है। आपकी आवश्यकताओं का उपयोग करके शायद पूरा किया जाएगा:
Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
इसका एक प्लस यह है कि यह इंस्टेंस (कतार) पर लॉक होता है, इसलिए आप कंपोजिट ऑपरेशन्स की एटोमेसी (जैसा कि जेरेड द्वारा समझाया गया है) सुनिश्चित करने के लिए कतार पर सिंक्रोनाइज़ कर सकते हैं। आप इसे किसी समवर्ती विधि से नहीं कर सकते, क्योंकि सभी ऑपरेशन इंस्टेंस पर लॉक किए बिना किए जाते हैं (java.util.concurrent.atomic वैरिएबल का उपयोग करके)। यदि कतार खाली है तो आपको इसे करने की आवश्यकता नहीं होगी, क्योंकि कतार खाली होने पर पोल () बस शून्य हो जाएगा, और पोल () परमाणु है। यह देखने के लिए जांचें कि क्या पोल () शून्य है। यदि यह करता है, प्रतीक्षा करें (), तो फिर से प्रयास करें। चाबी लगाने की जरूरत नहीं।
आखिरकार:
ईमानदारी से, मैं सिर्फ एक लिंक्डब्लॉकिंग क्यू का उपयोग करूंगा। यह आपके आवेदन के लिए अभी भी ओवरकिल है, लेकिन संभावना है कि यह ठीक काम करेगा। यदि यह पर्याप्त नहीं है (शख्सियत!), तो आप हमेशा कुछ और कोशिश कर सकते हैं, और इसका मतलब है कि आपको किसी भी सिंक्रनाइज़ किए गए सौदे से निपटने की ज़रूरत नहीं है:
BlockingQueue<YourObject> queue = new LinkedBlockingQueue<YourObject>();
queue.put(myObject); // Blocks until queue isn't full.
YourObject myObject = queue.take(); // Blocks until queue isn't empty.
बाकी हर कोई एक जैसा है। रखो शायद अवरुद्ध नहीं होगा, क्योंकि आप दो बिलियन ऑब्जेक्ट को कतार में रखने की संभावना नहीं रखते हैं।