2009-10-14 13 views
7

मुझे समवर्ती कतार के विचार को समझने में कुछ परेशानी हो रही है। मैं समझता हूं कि एक कतार एक फीफो है, या पहले सबसे पहले सेवा संरचना, आओ।समवर्ती कतार - सामान्य प्रश्न (विवरण और उपयोग)

अब जब हम समेकन भाग जोड़ते हैं, जिसे मैं थ्रेड सुरक्षा के रूप में समझता हूं (कृपया मुझे बताएं कि क्या यह गलत है) चीजें थोड़ा अस्पष्ट हो जाती हैं। समेकन से हमारा मतलब है कि विभिन्न धागे कतार में जोड़ सकते हैं, या कतार से हटा सकते हैं (एक आइटम की सेवा)? क्या इस परिचालन को आदेश देने की भावना प्रदान करने में समेकन है?

मैं एक समवर्ती कतार की कार्यक्षमता के सामान्य विवरण की सराहना करता हूं। एक समान पोस्ट here उतना सामान्य नहीं है जितना मैंने आशा की थी।

समवर्ती प्राथमिकता कतार के रूप में ऐसी चीज भी है? इसका उपयोग क्या होगा?

इस विषय पर किसी भी संक्षिप्त स्पष्टीकरण या सहायक लिंक के लिए अग्रिम में बहुत धन्यवाद।

उत्तर

0

आपको BlockingQueue इंटरफ़ेस परिभाषा की जांच करके शुरू करना चाहिए क्योंकि यह धागे के बीच संचार के लिए कतारों का उपयोग करने के लिए आधारशिला है और इसमें उत्पादक और उपभोक्ता धागे को अवरुद्ध या गैर-अवरुद्ध फैशन में कतार तक पहुंचने की अनुमति देने के लिए उपयोगिता विधियां शामिल हैं। यह, थ्रेड-सुरक्षित पहुंच के साथ "समवर्ती कतार" का गठन करने की मेरी समझ है (हालांकि मैंने कभी भी उस वाक्यांश के बारे में नहीं सुना है - BlockingQueue केवल java.util.concurrent पैकेज में मौजूद है)।

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

0

मैं "सहमति" से समझता हूं कि कतार थ्रेड-सुरक्षित है। इसका मतलब यह नहीं है कि यह कुशल होगा। हालांकि, मैं कल्पना करता हूं कि जावा कतार एक लॉक-फ्री कार्यान्वयन का उपयोग करती है जिसका अर्थ है कि दो धागे एक ही समय में पुश या पॉप का प्रयास करते समय बहुत कम या कोई दंडित नहीं होता है। आम तौर पर ऐसा होता है कि वे एक असेंबलर स्तर पर परमाणु लॉकिंग का उपयोग करते हैं जो सुनिश्चित करता है कि एक ही वस्तु को दो बार पॉप नहीं किया जा सकता है।

मैंने एक बार लॉक-फ्री फीफो कतार (डेल्फी में) लिखा था जो बहुत अच्छी तरह से काम करता था। अधिक कुशल जो पिछले संस्करण जो गंभीर वर्गों का उपयोग करते थे। सीएस संस्करण जमीन को रोकने के लिए विशेष रूप से कतार तक पहुंचने की कोशिश कर रहे कई धागे के साथ। लॉक-फ्री संस्करण में हालांकि कोई बाधा नहीं थी, इसे बहुत से थ्रेड तक पहुंचाते थे।

+0

थ्रेड-सुरक्षित क्यूई कार्यान्वयन को संशोधित करने के लिए लॉक प्राप्त करना थोड़ा ओवरहेड जोड़ता है और java.util.concurrent पैकेज के भीतर सभी ब्लॉकिंग क्यूई कार्यान्वयन कम से कम एक लॉक का उपयोग करेंगे (कुछ डालने/लेने के लिए दो का उपयोग करें)। ताले के बिना निर्माता/उपभोक्ता अवरुद्ध करने/ले जाने और थोक संचालन (जैसे नाली टीओ) करने में असमर्थ हैं, परमाणु रूप से नहीं किया जा सकता है। – Adamski

+0

मैंने सोचा कि जावा लॉक-फ्री कतारों का उपयोग करता है: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html – Steve

0

बस यहां link to the java.util.concurrent package छोड़कर मुझे लगता है कि यहां उठाए गए कुछ प्रश्नों के बारे में बहुत महत्वपूर्ण जानकारी है।

देखें: समवर्ती संग्रह और Memory Consistency Properties

5

धारणा है कि एक BlockingQueue थोड़ा भूमि के ऊपर प्रदान करता है एक सा याद आती अग्रणी है। लॉक प्राप्त करना काफी महत्वपूर्ण ओवरहेड का आह्वान करता है। संदर्भ स्विचिंग के साथ अकेले हम हजारों निर्देशों की बात कर रहे हैं। इतना ही नहीं, लेकिन एक धागे की प्रगति सीधे किसी अन्य धागे को प्रभावित करेगी। अब, यह साल पहले की तरह खराब नहीं था, लेकिन गैर अवरोध की तुलना में, यह काफी है।

BlockingQueue के पारस्परिक अपवर्जन

ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQUeue के लिए उपयोग ताले: माइकल और स्कॉट, गैर अवरुद्ध कतार एल्गोरिथ्म उपयोग करता है: तीन अवरुद्ध कतार जबकि

ConcurrentLinkedQueue, जावा 1.7 LinkedTransferQueue हैं।

मध्यम से कम विवाद (जो वास्तविक दुनिया परिदृश्य से अधिक है) के तहत, गैर अवरुद्ध कतार महत्वपूर्ण रूप से ब्लॉकिंग कतारों को निष्पादित करते हैं।

और बाधाओं की कमी के बारे में स्टीव की टिप्पणी पर ध्यान देने के लिए। भारी विवाद के तहत एक गैर अवरोधक एल्गोरिदम लगातार कैस प्रयासों पर गर्दन बोतल कर सकता है, जबकि अवरुद्ध करने से धागे निलंबित हो जाएंगे। हम तब देखते हैं कि भारी विवाद के तहत एक ब्लॉकिंग क्यूई एक गैर अवरुद्ध कतार करता है, लेकिन इस प्रकार की विवाद किसी भी माध्यम से मानक नहीं है।

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