2013-08-22 6 views
31
  1. के बीच क्या अंतर है ArrayBlockingQueue का उपयोग करना बेहतर है और LinkedBlockingQueue का उपयोग करना बेहतर क्यों है?
  2. यदि लिंक्डब्लॉकिंग क्यूई डिफ़ॉल्ट क्षमता MAX इंटीजर के बराबर है, तो क्या इसे डिफ़ॉल्ट क्षमता के साथ ब्लॉकिंगक्यूयू के रूप में उपयोग करने में वास्तव में मददगार है?
+0

# 1 बिंदु के लिए, मुझे लगता है कि यह एरेलीलिस्ट बनाम लिंक्डलिस्ट के समान कारण है;) – sp00m

+0

एक ब्लॉकिंगक्यूयू न केवल put() पर अवरुद्ध करता है। यह कतार खाली होने पर एक ले() को भी अवरुद्ध करता है। –

+0

@ sp00m लेकिन कतार में हमारे पास सम्मिलन या हटाने के बीच नहीं है। तो Ar4Listance और LinkedList –

उत्तर

17

ArrayBlockingQueue एक सरणी द्वारा समर्थित है कि आकार निर्माण के बाद कभी नहीं बदलेगा। क्षमता को Integer.MAX_VALUE पर सेट करने से अंतरिक्ष में उच्च लागत वाली एक बड़ी सरणी बन जाएगी। ArrayBlockingQueue हमेशा बाध्य है।

LinkedBlockingQueuecapacity तक पहुंचने तक गतिशील रूप से नोड बनाता है। यह डिफ़ॉल्ट रूप से Integer.MAX_VALUE है। ऐसी बड़ी क्षमता का उपयोग अंतरिक्ष में कोई अतिरिक्त लागत नहीं है। LinkedBlockingQueue वैकल्पिक रूप से बाध्य है।

12

ArrayBlockingQueue<E> और LinkedBlockingQueue<E>BlockingQueue<E> इंटरफ़ेस के सामान्य कार्यान्वयन हैं।

ArrayBlockingQueuearray और Queue द्वारा समर्थित है FIFO के रूप में आदेश लागू करें। कतार का सिर कतार के समय और पूंछ के मामले में सबसे पुराना तत्व सबसे छोटा तत्व है। ArrayBlockingQueue दूसरी तरफ आकार आकारबद्ध बफर भी तय किया गया है LinkedBlockingQueue लिंक किए गए नोड्स के शीर्ष पर स्थित वैकल्पिक रूप से बाध्य कतार है।

वैकल्पिक क्षमता बाध्य निर्माता तर्क के लिए एक रास्ता है क्योंकि क्षमता, अनिर्दिष्ट है अगर तुलना में यह Integer.MAX_VALUE के बराबर है अत्यधिक कतार विस्तार को रोकने के लिए के रूप में कार्य करता है।

here से और पढ़ें।

बेंचमार्क: http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html

+0

मुझे संदेह है कि LinkedBlockingQueue में उच्च थ्रूपुट होगा। दावा वापस करने के लिए कोई becnhmarks? –

+1

@EskoLuontola: आप यहां से एक बेंचमार्क पा सकते हैं: http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html –

+1

तो उस बेंचमार्क पर आधारित LinkedBlockingQueue तेज है उत्पादित उपभोक्ता परिदृश्य, लेकिन पहले दो बेंचमार्क में ArrayBlockingQueue थोड़ा तेज़ है। भले ही, विघटनकर्ता दोनों के साथ फर्श मिटा देता है: https://code.google.com/p/disruptor/wiki/PerformanceResults –

5

ArrayBlockingQueue को एक तत्व जोड़ने के बाद से यह केवल समर्थन वस्तु सरणी के एक तत्व के लिए एक संदर्भ की स्थापना, का मतलब है एक नोड बनाने और इसके स्थापित करने LinkedBlockingQueue को एक तत्व जोड़ते समय का मतलब है तेजी से माना जाता है आइटम, पिछला और अगले फ़ील्ड। इसके अलावा, जब हम LinkedBlockingQueue से तत्व हटाते हैं तो हटाया गया नोड कचरा बन जाता है जो ऐप के प्रदर्शन को प्रभावित कर सकता है।

स्मृति खपत के लिए ArrayBlockingQueue हमेशा खाली होने पर भी पूर्ण क्षमता वाले ऑब्जेक्ट सरणी रखता है। दूसरी तरफ LinkedBlockingQueue में एक तत्व 3 ऑब्जेक्ट फ़ील्ड वाले ऑब्जेक्ट वाला नोड है।

+0

यह कारण बताते हुए एक अच्छा जवाब है, लेकिन आपने उल्लेख किया है कि ऐरेब्लॉकिंगक्यूयू तेज होना चाहिए और मैं सहमत हूं आपके द्वारा प्रदान किए गए कारणों के आधार पर आप के साथ। लेकिन जावाडॉक्स कहते हैं कि "लिंक्ड कतारों में आमतौर पर सरणी आधारित कतारों की तुलना में उच्च थ्रूपुट होता है लेकिन अधिकांश समवर्ती अनुप्रयोगों में कम अनुमानित प्रदर्शन होता है।" LinkedBlockingQueue.class देखें – spiderman

+1

लेटेंसी और थ्रूपुट 2 अलग-अलग चीजें हैं।ArrayBlockingQueue में बेहतर विलंबता है क्योंकि यह सरणी में संदर्भ सेट करने के लिए तेज़ है जबकि LinkedBlockingQueue में बेहतर थ्रूपुट है क्योंकि यह 2 diff ताले का उपयोग करता है और ले लेता है और केवल किनारे की स्थिति पर सिंक्रनाइज़ करता है। –

1

ArrayBlockingQueue:

ArrayBlockingQueue एक घिरा है, अवरुद्ध कतार है कि तत्वों एक सरणी में आंतरिक रूप से संग्रहीत करता है। यह बाध्य है इसका मतलब है कि यह असीमित मात्रा में तत्वों को स्टोर नहीं कर सकता है। एक ही समय में स्टोर किए जा सकने वाले तत्वों की संख्या पर ऊपरी सीमा है। आप तत्काल समय पर ऊपरी बाउंड सेट करते हैं, और उसके बाद इसे बदला नहीं जा सकता है।

LinkedBlockingQueue

LinkedBlockingQueue किसी लिंक किए गए संरचना (लिंक किए गए नोड्स) में तत्वों आंतरिक रूप से रहता है। वांछित अगर यह जुड़ा हुआ संरचना वैकल्पिक रूप से ऊपरी बाउंड हो सकती है। यदि कोई ऊपरी सीमा निर्दिष्ट नहीं है, तो Integer.MAX_VALUE को ऊपरी बाउंड के रूप में उपयोग किया जाता है।

समानता

ArrayBlockingQueue/LinkedBlockingQueue भंडार फीफो में आंतरिक रूप से तत्वों (प्रथम में, सबसे पहले आउट) आदेश। कतार का सिर वह तत्व है जो कतार में सबसे लंबा समय रहा है, और कतार की पूंछ वह तत्व है जो कतार में सबसे कम समय में रही है।

मतभेद

  • LinkedBlockingQueue क्रमशः प्रविष्टि और हटाने के लिए एक putLock और एक takeLock है, लेकिन ArrayBlockingQueue केवल 1 ताला उपयोग करता है।
  • ऐरेब्लॉकिंगक्यूयू एकल-लॉक डबल कंडीशन एल्गोरिदम का उपयोग करता है और लिंक्डब्लॉकिंगक्यूयू "दो लॉक कतार" एल्गोरिदम का संस्करण है और इसमें 2 ताले 2 स्थितियां हैं (टेक लॉक, पॉट लॉक)।

दो लॉक कतार एल्गोरिथ्म LinkedBlockingQueue Implementation.Thus LinkedBlockingQueue के टेक और डाल द्वारा किया जाता है की जा रही समवर्ती काम कर सकते हैं, लेकिन यह ArrayBlockingQueue के साथ ऐसा नहीं है। ArrayBlockingQueue में एक लॉक का उपयोग करने का कारण है, ArrayBlockingQueue को ओवरराइटिंग प्रविष्टियों से बचना है ताकि उसे यह पता होना चाहिए कि शुरुआत और अंत कहां है। एक LinkedBlockQueue को यह जानने की आवश्यकता नहीं है क्योंकि यह कतार में नोड्स को साफ करने के बारे में जीसी की चिंता करने देता है।

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