एक्सचेंजर और सिंक्रोनस क्यूयू के बीच क्या अंतर है? और उन परिदृश्यों जिनमें से प्रत्येक का उपयोग किया जा सकता है? कौन सा बेहतर प्रदर्शन के रूप में है? (लॉक वार?)सिंक्रोनस क्यूई एक्स एक्सचेंजर
उत्तर
एक Exchanger
एक शुद्ध सिंक्रनाइज़ेशन तंत्र है जबकि SynchronousQueue
अतिरिक्त मानक कतार डेटा संरचना के सभी संचालन प्रदान करता है। इसका अर्थ यह है कि उदाहरण के लिए आप कतार में कौन सी ऑब्जेक्ट्स देख सकते हैं, कतारबद्ध रूप से कतार से आइटम को हटाकर निर्धारित किए गए कार्यों को अभी तक निष्पादित नहीं कर सकते हैं - ऑपरेशन Exchanger
ऑफ़र नहीं करता है। चूंकि कई कार्यान्वयन कतार आकार पर सीमा निर्धारित करने की अनुमति देते हैं, इसलिए आपको अपने संसाधन उपयोग पर अतिरिक्त नियंत्रण मिलता है और यदि कतार एक निश्चित दहलीज से ऊपर बढ़ती है तो अनुरोध छोड़ सकते हैं। दूसरी तरफ, Exchanger
बॉक्स के बाहर दो-तरफा संचार प्रदान करता है जबकि एक कतार केवल एक ही रास्ता है (हालांकि कोई अन्य दिशा में संचार को कार्यान्वित कर सकता है)। चूंकि कई व्यावहारिक परिस्थितियों में केवल एक उत्पादक-उपभोक्ता संबंधों की आवश्यकता होती है, इसलिए एपीआई और ऊपर सूचीबद्ध अतिरिक्त संचालन को समझने में आसान होने के कारण एक कतार अक्सर बेहतर होती है।
This articleExchanger
के लिए व्यावहारिक उपयोग केस का वर्णन करता है। वे थ्रेड के बीच संचार करते समय नई वस्तुओं को एकत्रित करने और कचरा बनाने से बचने में सक्षम होने पर ध्यान केंद्रित करते हैं (कार्यान्वयन के आधार पर, कतारें जब आप उन्हें कुछ जोड़ती हैं तो प्रविष्टियां आवंटित कर सकती हैं)। प्रदर्शन शायद आपके विशेष उपयोग मामले पर निर्भर करेगा। उदाहरण में वे दक्षता (कचरा संग्रहण से परहेज) के लिए Exchanger
का उपयोग करते हैं, लेकिन ज्यादातर मामलों में (यदि आपको उप-मिलीसेकंद विलंबता प्रदान करने की आवश्यकता नहीं है) तो ऑब्जेक्ट या दो आवंटित करना इतना बड़ा मुद्दा नहीं है और मैं उपयोग करना पसंद करूंगा अतिरिक्त नियंत्रण के लिए एक कतार यह अनुमति देता है।
संपादित करें: मैं Oracle JDK में Exchanger.java
के लिए स्रोत की जाँच की और यह Exchanger.doExchange()
में वर्ग Exchanger.Node
के अस्थायी वस्तुओं पैदा करता है। तो ऐसा लगता है कि लिंक किए गए लेख राज्य के लेखकों के विपरीत, Exchanger
आवंटन मुक्त नहीं है। न तो (स्पष्ट रूप से) LinkedBlockingQueue
है। ArrayBlockingQueue
, इसके विपरीत, जब कोई आइटम इसमें संलग्न होता है तो कोई अस्थायी ऑब्जेक्ट आवंटित नहीं करता है। यह केवल एक सरणी आवंटित करता है जब इसे बनाए जाने पर तत्वों की अधिकतम अनुमत संख्या को पकड़ने के लिए, लेकिन यह केवल एक बार का ऑपरेशन है। उपयोग के दौरान, यह नई वस्तुओं को नहीं बनाता है, इसलिए शुद्ध जीसी बिंदु से यह Exchanger
से बेहतर होना चाहिए।
धन्यवाद मीकल। क्या आप विस्तार से बता सकते हैं कि एक्सचेंजर नई वस्तुओं को एकत्रित करने और कचरा कैसे बचाता है? क्या यह कतार नई नोड्स और एक्सचेंजर्स के लिए ऑब्जेक्ट आवंटित/डिलीकेट करता है, संदर्भों के आदान-प्रदान में मदद करता है? – Hemanshu
एक्सचेंजर, प्रत्येक ऑब्जेक्ट को दो धागे के बीच एक्सचेंज करता है। इसका मतलब है कि आपके पास दो डेटा संरचनाएं आगे और पीछे हो सकती हैं जिन्हें बार-बार पुन: उपयोग किया जा सकता है। यदि यह एक बड़ी या महंगी वस्तु है, उदा। एक बाइटबफर, यह एक सिंक्रोनस क्यूयू अव्यवहारिक बना सकता है। –
@ हेमांशु एक कतार को रैपर की आवश्यकता हो सकती है, उदाहरण के लिए 'लिंक्डब्लॉकिंग क्यूयू' को 'नोड' ऑब्जेक्ट्स की आवश्यकता होती है जो अगले लिंक किए गए आइटमों के लिए उनके पेलोड्स प्लस संदर्भ रखती हैं। एक 'ऐरेब्लॉकिंग क्यूयू' को ऐसे रैपर की आवश्यकता नहीं है, लेकिन 'लिंक्डब्लॉकिंग क्यूयू' के विपरीत इसे पहले से अपने अधिकतम आकार के लिए एक सरणी आवंटित करनी होगी। यह एक बार का ऑपरेशन है, इसलिए आमतौर पर कोई समस्या नहीं है, लेकिन हाँ, यह एक आवंटन है। तो एक कतार हो सकती है, लेकिन प्रत्येक आइटम को अतिरिक्त आवंटन का कारण नहीं है। अब, मैंने 'एक्सचेंजर' के लिए कोड की जांच की है और यह वास्तव में अस्थायी 'नोड' ऑब्जेक्ट्स बनाता है। लेख के लेखकों को सादा गलत लगता है। –
चलिए मुख्य बिंदु पर ध्यान केंद्रित करते हैं .. एक्सचेंजर: एक मिलनसार बिंदु है जहां दो धागे ऑब्जेक्ट्स का आदान-प्रदान कर सकते हैं सिंक्यूयू: एक कतार है! एक धागा रखता है और इंतजार करता है, जब तक कि कोई अन्य थ्रेड एक्सचेंजर एक प्रकार का बिडरेक्शनल सिंकक्यूयू
- 1. क्यूई
- 2. क्यूई
- 3. क्यूई
- 4. थ्रेड क्यूई
- 5. ज़ीरोएमक्यू क्यूई
- 6. ऑडियो क्यूई
- 7. सिंक्रोनस स्टार्टएक्टिविटीफॉररसल्ट -
- 8. प्राथमिकता क्यूई/हीप अपडेट
- 9. एनएसओपरेशन क्यूई आईफोन
- 10. संदेश क्यूई एक बार
- 11. सी # सिंक्रोनस प्रक्रिया
- 12. सिंक्रोनस और एसिंक्रोनस कॉलबैक
- 13. आईई सिंक्रोनस xmlhttprequest
- 14. .NET C# सिंक्रोनस रिसीव
- 15. हत्या समारोह सिंक्रोनस है?
- 16. मुझे सिंक्रोनस क्यूयू
- 17. एंड्रॉइड स्टार्ट सेवा सिंक्रोनस?
- 18. सिंक्रोनस "अजाक्स" अनुरोध
- 19. सिंक्रोनस और एसिंक्रोनस गतिविधियां
- 20. FB.api() को सिंक्रोनस
- 21. jquery सिंक्रोनस फ़ंक्शंस
- 22. क्या रेडिस सिंक्रोनस अपडेट हैं?
- 23. क्या jQuery ट्रिगर फ़ंक्शन सिंक्रोनस
- 24. सिंक्रोनस Moq mocks को async
- 25. AJAX अनुरोध सिंक्रोनस बनाम असिंक्रोनस
- 26. जोर सिंक्रोनस या असीमित है?
- 27. क्रोम में सिंक्रोनस कंसोल लॉगिंग
- 28. एक्शन टी सिंक्रोनस और एसिंक्रोनस
- 29. असीमित Google विज्ञापन बनाम सिंक्रोनस
- 30. EXT जेएस सिंक्रोनस AJAX अनुरोध
माइक्रो-सेकंड गिनती के बिना, इससे कोई फ़र्क नहीं पड़ता कि आप किस का उपयोग करते हैं। –