2013-10-04 2 views
10

मुझे थ्रेड-सुरक्षित LIFO संरचना की आवश्यकता है और पाया है कि मैं इसके लिए Deque के थ्रेड-सुरक्षित कार्यान्वयन का उपयोग कर सकता हूं। जावा 7 ने ConcurrentLinkedDeque पेश किया है और जावा 6 में LinkedBlockingDeque है।ConcurrentLinkedDeque बनाम LinkedBlockingDeque

मैं में LinkedBlockingDeque ऐसे addFirst() के रूप में और removeFirst() यह ConcurrentLinkedDeque को कोई फर्क है केवल गैर अवरुद्ध तरीकों का उपयोग करना हो तो?

यानी यदि आप अवरोधक पहलू को नजरअंदाज करते हैं, तो क्या ConcurrentLinkedDeque और LinkedBlockingDeque के बीच कोई अन्य अंतर है, LinkedBlockingDeque के बाध्य होने के अलावा?

+0

क्या आपने दोनों के कार्यान्वयन को देखा है? आपका मानदंड क्या है, जहां आप दूसरे के लिए निर्णय लेते हैं? प्रदर्शन? MemoryOverhead? – Fildor

+0

मैं सिर्फ यह जानना चाहता था कि अगर मैं जावा 6 के साथ रहा और लिंकडब्लॉकिंग डेक – Nufail

उत्तर

5

दो बातें:

1: मैं में LinkedBlockingDeque ऐसे addFirst() के रूप में और removeFirst() यह ConcurrentLinkedDeque को कोई फर्क है केवल गैर अवरुद्ध तरीकों का उपयोग करना हो तो?

इन विधियों LinkedBlockingDeque में समवर्ती ताला व्यवहार के मामले में अंतर क्या है,:

public E removeFirst() { 
     E x = pollFirst(); 
     .. 
    } 
public E pollFirst() { 
     lock.lock(); //Common lock for while list 
     try { 
      return unlinkFirst(); 
     } finally { 
      lock.unlock(); 
     } 
    } 

इसी addFirst के लिए विधि। ConcurrentLinkedDeque में दोनों विधिओं के लिए यह लॉकिंग व्यवहार अलग है और यह अधिक कुशल है क्योंकि यह पूरी सूची को लॉक नहीं करता है, लेकिन इसका सबसेट, ConcurrentLinkedDeque के लिए स्रोत की जांच करने से आपको अधिक स्पष्टता मिल जाएगी।

2:ConcurrentLinkedDeque की जावाडोक से:

खबरदार है कि सबसे अधिक संग्रह में विपरीत,, आकार विधि एक निरंतर समय ऑपरेशन नहीं है।

..

इसके अतिरिक्त, थोक संचालन addAll, removeAll, retainAll, शामिल है, बराबर, और toArray को परमाणु रूप से करने की गारंटी नहीं है।

ऊपर LinkedBlockingDeque

4

ConcurentLinkedDequeue लॉक-फ्री है (स्रोत कोड में टिप्पणियां देखें) जबकि LinkedBlockingQueue लॉकिंग का उपयोग करता है। यही कारण है कि पूर्व और अधिक कुशल

9

बनाम ConcurrentLinkedDeque

LinkedBlockingDeque वर्ग "मानक" अवरुद्ध Deque होना है महान Doug Lea (मेरे जोर) के शब्दों में

LinkedBlockingDeque माना जाता है है कक्षा। वर्तमान कार्यान्वयन में अपेक्षाकृत कम ओवरहेड है लेकिन अपेक्षाकृत खराब स्केलेबिलिटी है। अपेक्षाकृत उच्च भूमि के ऊपर है, लेकिन बहुत अच्छा scalability: ...

... ConcurrentLinkedDeque LinkedBlockingDeque के रूप में लगभग विपरीत प्रदर्शन प्रोफ़ाइल है। ... समवर्ती अनुप्रयोगों में, यह सामान्य नहीं है कि एक डेक सुरक्षित है जो थ्रेड सुरक्षित है, फिर भी अवरोधन का समर्थन नहीं करता है। और जो लोग करते हैं उनमें से अधिकांश शायद विशेष मामले समाधान के साथ बेहतर हैं।

उन्होंने सुझाव है कि आप LinkedBlockingDeque का उपयोग करना चाहिए जब तक आप विशेष रूप से ConcurrentLinkedDeque की सुविधाओं की जरूरत है लगता है।

+1

का उपयोग किया, तो ध्यान दें कि उन्होंने अनौपचारिक रूप से और 2004 में कहा था। – kervin

1

पहली बात के लिए सही नहीं है दोनों LinkedBlockingDeque और ConcurrentLinkedDeque दोनों धागा सुरक्षित हैं, लेकिन जो एक का उपयोग करने के लिए अपने आवेदन की आवश्यकता पर निर्भर करता है।

उदाहरण के लिए,

LinkedBlockingDequeue: इस संग्रह अगर आप चाहते हैं कि एक समय में केवल एकल थ्रेड अपने डेटा पर काम कर सकते हैं और उपयोग आप अपने आवेदन के लिए अवरुद्ध आवश्यकता होती है।

ConcurrentLinkedDeque: यह वह जगह है भी थ्रेड सुरक्षित संग्रह Deque, तो आप आवेदन बहु लड़ी है और आप चाहते हैं कि आपके धागा डेटा का उपयोग कर सकते हैं में से हर एक तो ConcurrentLinkedDequeue इसके लिए सबसे अच्छा choise है।

अपने प्रश्न के रूप में,

1. मैं एक धागा सुरक्षित LIFO संरचना की आवश्यकता है,

उपयोग LinkedBlockingDeque अगर एक बार में आप केवल एकल थ्रेड अपने डेटा काम कर सकते हैं चाहता हूँ।

उपयोग ConcurrentLinkedDeque आप देखेंगे कि प्रत्येक धागा साझा डेटा

2. आप अवरुद्ध पहलू की उपेक्षा तो उपयोग कर सकते हैं चाहते हैं, वहाँ ConcurrentLinkedDeque और LinkedBlockingDeque बीच किसी भी अन्य अंतर,

हाँ, वहाँ है लिंकडब्लॉकिंगडेक के रूप में एक अंतर लॉकिंग तंत्र का उपयोग कर रहा है और ConcurrentLinkedDeque यह नहीं है कि जब आप अपना डेटा संचालित करना चाहते हैं तो यह प्रदर्शन को प्रभावित कर सकता है।

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