2012-03-16 15 views
10

एक्सचेंजर और सिंक्रोनस क्यूयू के बीच क्या अंतर है? और उन परिदृश्यों जिनमें से प्रत्येक का उपयोग किया जा सकता है? कौन सा बेहतर प्रदर्शन के रूप में है? (लॉक वार?)सिंक्रोनस क्यूई एक्स एक्सचेंजर

+0

माइक्रो-सेकंड गिनती के बिना, इससे कोई फ़र्क नहीं पड़ता कि आप किस का उपयोग करते हैं। –

उत्तर

8

एक Exchanger एक शुद्ध सिंक्रनाइज़ेशन तंत्र है जबकि SynchronousQueue अतिरिक्त मानक कतार डेटा संरचना के सभी संचालन प्रदान करता है। इसका अर्थ यह है कि उदाहरण के लिए आप कतार में कौन सी ऑब्जेक्ट्स देख सकते हैं, कतारबद्ध रूप से कतार से आइटम को हटाकर निर्धारित किए गए कार्यों को अभी तक निष्पादित नहीं कर सकते हैं - ऑपरेशन Exchanger ऑफ़र नहीं करता है। चूंकि कई कार्यान्वयन कतार आकार पर सीमा निर्धारित करने की अनुमति देते हैं, इसलिए आपको अपने संसाधन उपयोग पर अतिरिक्त नियंत्रण मिलता है और यदि कतार एक निश्चित दहलीज से ऊपर बढ़ती है तो अनुरोध छोड़ सकते हैं। दूसरी तरफ, Exchanger बॉक्स के बाहर दो-तरफा संचार प्रदान करता है जबकि एक कतार केवल एक ही रास्ता है (हालांकि कोई अन्य दिशा में संचार को कार्यान्वित कर सकता है)। चूंकि कई व्यावहारिक परिस्थितियों में केवल एक उत्पादक-उपभोक्ता संबंधों की आवश्यकता होती है, इसलिए एपीआई और ऊपर सूचीबद्ध अतिरिक्त संचालन को समझने में आसान होने के कारण एक कतार अक्सर बेहतर होती है।

This articleExchanger के लिए व्यावहारिक उपयोग केस का वर्णन करता है। वे थ्रेड के बीच संचार करते समय नई वस्तुओं को एकत्रित करने और कचरा बनाने से बचने में सक्षम होने पर ध्यान केंद्रित करते हैं (कार्यान्वयन के आधार पर, कतारें जब आप उन्हें कुछ जोड़ती हैं तो प्रविष्टियां आवंटित कर सकती हैं)। प्रदर्शन शायद आपके विशेष उपयोग मामले पर निर्भर करेगा। उदाहरण में वे दक्षता (कचरा संग्रहण से परहेज) के लिए Exchanger का उपयोग करते हैं, लेकिन ज्यादातर मामलों में (यदि आपको उप-मिलीसेकंद विलंबता प्रदान करने की आवश्यकता नहीं है) तो ऑब्जेक्ट या दो आवंटित करना इतना बड़ा मुद्दा नहीं है और मैं उपयोग करना पसंद करूंगा अतिरिक्त नियंत्रण के लिए एक कतार यह अनुमति देता है।

संपादित करें: मैं Oracle JDK में Exchanger.java के लिए स्रोत की जाँच की और यह Exchanger.doExchange() में वर्ग Exchanger.Node के अस्थायी वस्तुओं पैदा करता है। तो ऐसा लगता है कि लिंक किए गए लेख राज्य के लेखकों के विपरीत, Exchanger आवंटन मुक्त नहीं है। न तो (स्पष्ट रूप से) LinkedBlockingQueue है। ArrayBlockingQueue, इसके विपरीत, जब कोई आइटम इसमें संलग्न होता है तो कोई अस्थायी ऑब्जेक्ट आवंटित नहीं करता है। यह केवल एक सरणी आवंटित करता है जब इसे बनाए जाने पर तत्वों की अधिकतम अनुमत संख्या को पकड़ने के लिए, लेकिन यह केवल एक बार का ऑपरेशन है। उपयोग के दौरान, यह नई वस्तुओं को नहीं बनाता है, इसलिए शुद्ध जीसी बिंदु से यह Exchanger से बेहतर होना चाहिए।

+0

धन्यवाद मीकल। क्या आप विस्तार से बता सकते हैं कि एक्सचेंजर नई वस्तुओं को एकत्रित करने और कचरा कैसे बचाता है? क्या यह कतार नई नोड्स और एक्सचेंजर्स के लिए ऑब्जेक्ट आवंटित/डिलीकेट करता है, संदर्भों के आदान-प्रदान में मदद करता है? – Hemanshu

+0

एक्सचेंजर, प्रत्येक ऑब्जेक्ट को दो धागे के बीच एक्सचेंज करता है। इसका मतलब है कि आपके पास दो डेटा संरचनाएं आगे और पीछे हो सकती हैं जिन्हें बार-बार पुन: उपयोग किया जा सकता है। यदि यह एक बड़ी या महंगी वस्तु है, उदा। एक बाइटबफर, यह एक सिंक्रोनस क्यूयू अव्यवहारिक बना सकता है। –

+0

@ हेमांशु एक कतार को रैपर की आवश्यकता हो सकती है, उदाहरण के लिए 'लिंक्डब्लॉकिंग क्यूयू' को 'नोड' ऑब्जेक्ट्स की आवश्यकता होती है जो अगले लिंक किए गए आइटमों के लिए उनके पेलोड्स प्लस संदर्भ रखती हैं। एक 'ऐरेब्लॉकिंग क्यूयू' को ऐसे रैपर की आवश्यकता नहीं है, लेकिन 'लिंक्डब्लॉकिंग क्यूयू' के विपरीत इसे पहले से अपने अधिकतम आकार के लिए एक सरणी आवंटित करनी होगी। यह एक बार का ऑपरेशन है, इसलिए आमतौर पर कोई समस्या नहीं है, लेकिन हाँ, यह एक आवंटन है। तो एक कतार हो सकती है, लेकिन प्रत्येक आइटम को अतिरिक्त आवंटन का कारण नहीं है। अब, मैंने 'एक्सचेंजर' के लिए कोड की जांच की है और यह वास्तव में अस्थायी 'नोड' ऑब्जेक्ट्स बनाता है। लेख के लेखकों को सादा गलत लगता है। –

2

चलिए मुख्य बिंदु पर ध्यान केंद्रित करते हैं .. एक्सचेंजर: एक मिलनसार बिंदु है जहां दो धागे ऑब्जेक्ट्स का आदान-प्रदान कर सकते हैं सिंक्यूयू: एक कतार है! एक धागा रखता है और इंतजार करता है, जब तक कि कोई अन्य थ्रेड एक्सचेंजर एक प्रकार का बिडरेक्शनल सिंकक्यूयू

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