- के बीच क्या अंतर है ArrayBlockingQueue का उपयोग करना बेहतर है और LinkedBlockingQueue का उपयोग करना बेहतर क्यों है?
- यदि लिंक्डब्लॉकिंग क्यूई डिफ़ॉल्ट क्षमता MAX इंटीजर के बराबर है, तो क्या इसे डिफ़ॉल्ट क्षमता के साथ ब्लॉकिंगक्यूयू के रूप में उपयोग करने में वास्तव में मददगार है?
उत्तर
ArrayBlockingQueue
एक सरणी द्वारा समर्थित है कि आकार निर्माण के बाद कभी नहीं बदलेगा। क्षमता को Integer.MAX_VALUE
पर सेट करने से अंतरिक्ष में उच्च लागत वाली एक बड़ी सरणी बन जाएगी। ArrayBlockingQueue
हमेशा बाध्य है।
LinkedBlockingQueue
capacity
तक पहुंचने तक गतिशील रूप से नोड बनाता है। यह डिफ़ॉल्ट रूप से Integer.MAX_VALUE
है। ऐसी बड़ी क्षमता का उपयोग अंतरिक्ष में कोई अतिरिक्त लागत नहीं है। LinkedBlockingQueue
वैकल्पिक रूप से बाध्य है।
ArrayBlockingQueue<E>
और LinkedBlockingQueue<E>
BlockingQueue<E>
इंटरफ़ेस के सामान्य कार्यान्वयन हैं।
ArrayBlockingQueue
array
और Queue
द्वारा समर्थित है FIFO
के रूप में आदेश लागू करें। कतार का सिर कतार के समय और पूंछ के मामले में सबसे पुराना तत्व सबसे छोटा तत्व है। ArrayBlockingQueue
दूसरी तरफ आकार आकारबद्ध बफर भी तय किया गया है LinkedBlockingQueue
लिंक किए गए नोड्स के शीर्ष पर स्थित वैकल्पिक रूप से बाध्य कतार है।
वैकल्पिक क्षमता बाध्य निर्माता तर्क के लिए एक रास्ता है क्योंकि क्षमता, अनिर्दिष्ट है अगर तुलना में यह Integer.MAX_VALUE
के बराबर है अत्यधिक कतार विस्तार को रोकने के लिए के रूप में कार्य करता है।
here से और पढ़ें।
बेंचमार्क: http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html
मुझे संदेह है कि LinkedBlockingQueue में उच्च थ्रूपुट होगा। दावा वापस करने के लिए कोई becnhmarks? –
@EskoLuontola: आप यहां से एक बेंचमार्क पा सकते हैं: http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html –
तो उस बेंचमार्क पर आधारित LinkedBlockingQueue तेज है उत्पादित उपभोक्ता परिदृश्य, लेकिन पहले दो बेंचमार्क में ArrayBlockingQueue थोड़ा तेज़ है। भले ही, विघटनकर्ता दोनों के साथ फर्श मिटा देता है: https://code.google.com/p/disruptor/wiki/PerformanceResults –
ArrayBlockingQueue को एक तत्व जोड़ने के बाद से यह केवल समर्थन वस्तु सरणी के एक तत्व के लिए एक संदर्भ की स्थापना, का मतलब है एक नोड बनाने और इसके स्थापित करने LinkedBlockingQueue को एक तत्व जोड़ते समय का मतलब है तेजी से माना जाता है आइटम, पिछला और अगले फ़ील्ड। इसके अलावा, जब हम LinkedBlockingQueue से तत्व हटाते हैं तो हटाया गया नोड कचरा बन जाता है जो ऐप के प्रदर्शन को प्रभावित कर सकता है।
स्मृति खपत के लिए ArrayBlockingQueue हमेशा खाली होने पर भी पूर्ण क्षमता वाले ऑब्जेक्ट सरणी रखता है। दूसरी तरफ LinkedBlockingQueue में एक तत्व 3 ऑब्जेक्ट फ़ील्ड वाले ऑब्जेक्ट वाला नोड है।
यह कारण बताते हुए एक अच्छा जवाब है, लेकिन आपने उल्लेख किया है कि ऐरेब्लॉकिंगक्यूयू तेज होना चाहिए और मैं सहमत हूं आपके द्वारा प्रदान किए गए कारणों के आधार पर आप के साथ। लेकिन जावाडॉक्स कहते हैं कि "लिंक्ड कतारों में आमतौर पर सरणी आधारित कतारों की तुलना में उच्च थ्रूपुट होता है लेकिन अधिकांश समवर्ती अनुप्रयोगों में कम अनुमानित प्रदर्शन होता है।" LinkedBlockingQueue.class देखें – spiderman
लेटेंसी और थ्रूपुट 2 अलग-अलग चीजें हैं।ArrayBlockingQueue में बेहतर विलंबता है क्योंकि यह सरणी में संदर्भ सेट करने के लिए तेज़ है जबकि LinkedBlockingQueue में बेहतर थ्रूपुट है क्योंकि यह 2 diff ताले का उपयोग करता है और ले लेता है और केवल किनारे की स्थिति पर सिंक्रनाइज़ करता है। –
ArrayBlockingQueue:
ArrayBlockingQueue एक घिरा है, अवरुद्ध कतार है कि तत्वों एक सरणी में आंतरिक रूप से संग्रहीत करता है। यह बाध्य है इसका मतलब है कि यह असीमित मात्रा में तत्वों को स्टोर नहीं कर सकता है। एक ही समय में स्टोर किए जा सकने वाले तत्वों की संख्या पर ऊपरी सीमा है। आप तत्काल समय पर ऊपरी बाउंड सेट करते हैं, और उसके बाद इसे बदला नहीं जा सकता है।
LinkedBlockingQueue
LinkedBlockingQueue किसी लिंक किए गए संरचना (लिंक किए गए नोड्स) में तत्वों आंतरिक रूप से रहता है। वांछित अगर यह जुड़ा हुआ संरचना वैकल्पिक रूप से ऊपरी बाउंड हो सकती है। यदि कोई ऊपरी सीमा निर्दिष्ट नहीं है, तो Integer.MAX_VALUE को ऊपरी बाउंड के रूप में उपयोग किया जाता है।
समानता
ArrayBlockingQueue/LinkedBlockingQueue भंडार फीफो में आंतरिक रूप से तत्वों (प्रथम में, सबसे पहले आउट) आदेश। कतार का सिर वह तत्व है जो कतार में सबसे लंबा समय रहा है, और कतार की पूंछ वह तत्व है जो कतार में सबसे कम समय में रही है।
मतभेद
- LinkedBlockingQueue क्रमशः प्रविष्टि और हटाने के लिए एक putLock और एक takeLock है, लेकिन ArrayBlockingQueue केवल 1 ताला उपयोग करता है।
- ऐरेब्लॉकिंगक्यूयू एकल-लॉक डबल कंडीशन एल्गोरिदम का उपयोग करता है और लिंक्डब्लॉकिंगक्यूयू "दो लॉक कतार" एल्गोरिदम का संस्करण है और इसमें 2 ताले 2 स्थितियां हैं (टेक लॉक, पॉट लॉक)।
दो लॉक कतार एल्गोरिथ्म LinkedBlockingQueue Implementation.Thus LinkedBlockingQueue के टेक और डाल द्वारा किया जाता है की जा रही समवर्ती काम कर सकते हैं, लेकिन यह ArrayBlockingQueue के साथ ऐसा नहीं है। ArrayBlockingQueue में एक लॉक का उपयोग करने का कारण है, ArrayBlockingQueue को ओवरराइटिंग प्रविष्टियों से बचना है ताकि उसे यह पता होना चाहिए कि शुरुआत और अंत कहां है। एक LinkedBlockQueue को यह जानने की आवश्यकता नहीं है क्योंकि यह कतार में नोड्स को साफ करने के बारे में जीसी की चिंता करने देता है।
- 1. ArrayBlockingQueue
- 2. ArrayBlockingQueue सम्मिलन और हटाने के लिए एक एकल लॉक का उपयोग करता है लेकिन LinkedBlockingQueue 2 अलग ताले
- 3. Java ThreadPoolExecutor ArrayBlockingQueue
- 4. जो बेहतर है LinkedBlockingQueue unbounded या LinkedBlockingQueue क्षमता
- 5. क्यों LinkedBlockingQueue # poll() लटका सकता है?
- 6. LinkedBlockingQueue put बनाम
- 7. जावा प्रदर्शन समस्या LinkedBlockingQueue
- 8. LinkedBlockingQueue से LMAX 'विघटनकर्ता
- 9. LinkedBlockingQueue का उपयोग कर IntentService का कार्यान्वयन?
- 10. ArrayBlockingQueue सरणी तत्वों को shuffling से कैसे बचता है?
- 11. ArrayBlockingQueue का उपयोग प्रक्रिया धीमा कर देता है
- 12. ExectuorService बनाम ThreadPoolExecutor (जो LinkedBlockingQueue का उपयोग कर रहा है)
- 13. क्यों ArayBlockingQueue को एक बाध्य कतार कहा जाता है जबकि एक LinkedBlockingQueue को एक अवरुद्ध अवरुद्ध कतार कहा जाता है?
- 14. LinkedBlockingQueue का उपयोग मल्टी थ्रेड जावा प्रोग्राम के लिए पर्याप्त है?
- 15. Java LinkedBlockingQueue जब सिग्नल करने की क्षमता के साथ किया जाता है?
- 16. क्या जावा में कोई भी (असंबद्ध) मेला अवरुद्ध कतार है?
- 17. जावा कतार कार्यान्वयन, कौन सा?
- 18. ThreadPoolExecutor समस्या
- 19. java.util.concurrent पर थ्रेड को पार्क करने का कारण क्या हो सकता है। थ्रेडपूलएक्ससेटर.get टास्क
- 20. फिक्स्ड थ्रेडपूल और कैश थ्रेडपूल बनाने के दौरान विभिन्न कतार का उपयोग क्यों करें?
- 21. मुझे सिंक्रोनस क्यूयू
- 22. ThreadPoolExecutor और queue
- 23. java.util.concurrent.LinkedBlockingQueue डाल विधि स्काला
- 24. जावा में समवर्ती और अवरुद्ध कतार
- 25. OutOfMemoryError - प्रतीक्षा प्रतीक्षा थ्रेड कचरा क्यों नहीं हो सकता है?
- 26. प्रदर्शन
- 27. मैं कैसे सुनिश्चित करूं कि एक और थ्रेड हैंडलर इसे कॉल करने से पहले शून्य नहीं है?
- 28. "#", "$", "%", "&", और "_" "\ #", "\ $", "\%", "\ &", और "\ _"
- 29. क्या RejectedExecutionException
- 30. जावा एनआईओ पाइप बनाम ब्लॉकिंगक्यूयू
# 1 बिंदु के लिए, मुझे लगता है कि यह एरेलीलिस्ट बनाम लिंक्डलिस्ट के समान कारण है;) – sp00m
एक ब्लॉकिंगक्यूयू न केवल put() पर अवरुद्ध करता है। यह कतार खाली होने पर एक ले() को भी अवरुद्ध करता है। –
@ sp00m लेकिन कतार में हमारे पास सम्मिलन या हटाने के बीच नहीं है। तो Ar4Listance और LinkedList –