2011-12-21 12 views

उत्तर

39

सिंक्रोनसक्यूयू एक हैंडऑफ से अधिक है, जबकि लिंक्डब्लॉकिंग क्यूई सिर्फ एक तत्व की अनुमति देता है। अंतर यह है कि एक सिंक्रोनस क्यूयू पर पुट() कॉल वापस नहीं करेगा जब तक कोई संबंधित ले() कॉल न हो, लेकिन आकार 1 के लिंकडब्लॉकिंग क्यू के साथ, पुट() कॉल (खाली कतार में) तुरंत वापस आ जाएगी।

मैं यह नहीं कह सकता कि मैंने कभी भी सिंक्रोनस क्यूई का उपयोग सीधे किया है, लेकिन यह Executors.newCachedThreadPool() विधियों के लिए डिफ़ॉल्ट ब्लॉकिंग क्यूयू का उपयोग किया जाता है। यह अनिवार्य रूप से ब्लॉकिंगक्यूयू कार्यान्वयन है जब आप वास्तव में एक कतार चाहते हैं (आप किसी भी लंबित डेटा को बनाए रखना नहीं चाहते हैं)।

+0

ठीक है, इसलिए मुख्य विचार यह है कि, जब तक परिणाम पढ़ने के लिए तैयार नहीं होता है तब तक धागा पढ़ने को अवरुद्ध करता है और पढ़ना धागा पढ़ने के लिए तैयार होता है। क्या आप वास्तविक जीवन उदाहरण प्रदान कर सकते हैं जब यह उपयोगी हो सकता है – Anton

+8

@ उमर जब उपभोक्ताओं की तुलना में कतार के लिए कई धागे तेजी से वस्तुओं का उत्पादन कर सकते हैं तो उन्हें उपभोग और संसाधित कर सकते हैं - एक कतार आकार में बढ़ सकती है। सिंक्रोनस क्यूयू उत्पादकों में किसी भी विशिष्ट कोड के बिना संचार को नियंत्रित करने में मदद करता है।वास्तविक जीवन में यह एक बैठक के समान है जहां एक व्यक्ति दूसरों द्वारा पूछे जाने वाले प्रश्नों का उत्तर देता है। एक प्रकार के सचिव के रूप में सिंक्रोनस्यूयूयू पर विचार करें। – andrey

+0

मैं सिंकक्यू का काफी उपयोग करता हूं, यह एक अच्छा हैंडऑफ सार और अपेक्षाकृत अच्छा प्रभाव है। (प्रतीक्षा करते समय यह आवंटन है) – bestsss

9

जहां तक ​​मैं ऊपर कोड को समझता हूं वही काम करता है।

नहीं, कोड बिल्कुल समान नहीं है।

Sync.Q। सफल होने के प्रस्ताव के लिए वेटर (ओं) की आवश्यकता है। एलबीक्यू आइटम रखेगा और कोई वेटर नहीं होने पर भी प्रस्ताव तुरंत खत्म हो जाएगा।

सिंकक कार्यों के हैंडऑफ के लिए उपयोगी है। कल्पना करें कि आपके पास कतार में प्रतीक्षा करने के लिए एक सूची w/लंबित कार्य और 3 धागे उपलब्ध हैं, सूची में 1/4 के साथ offer() आज़माएं यदि स्वीकार नहीं किया गया है कि थ्रेड स्वयं को कार्य चला सकता है। [अंतिम 1/4 वर्तमान थ्रेड द्वारा संभाला जाना चाहिए, यदि आपको आश्चर्य है कि 1/4 और 1/3]

किसी कार्यकर्ता को कार्य सौंपने का प्रयास करने के बारे में सोचें, यदि कोई भी उपलब्ध नहीं है तो आपके पास कोई विकल्प है अपने आप को कार्य निष्पादित करने के लिए (या अपवाद फेंक दें)। इसके विपरीत डब्ल्यू/एलबीक्यू, कतार में कार्य को छोड़कर किसी भी निष्पादन की गारंटी नहीं देता है।

नोट: मामले डब्ल्यू/उपभोक्ताओं और प्रकाशक, एक ही है अर्थात प्रकाशक को ब्लॉक और उपभोक्ताओं के लिए प्रतीक्षा लेकिन offer या poll रिटर्न के बाद, यह सुनिश्चित करता है कार्य/तत्व नियंत्रित किया जा रहा है हो सकता है।

6

सिंक्रोनस क्यूयू का उपयोग करने का एक कारण एप्लिकेशन प्रदर्शन में सुधार करना है। यदि आपके पास धागे के बीच एक हाथ-बंद होना चाहिए, तो आपको कुछ सिंक्रनाइज़ेशन ऑब्जेक्ट की आवश्यकता होगी। यदि आप इसके उपयोग के लिए आवश्यक शर्तों को पूरा कर सकते हैं, तो सिंक्रोनस्यूयूयू सबसे तेज़ सिंक्रनाइज़ेशन ऑब्जेक्ट है जो मैंने पाया है। अन्य सहमत हैं। देखें: Implementation of BlockingQueue: What are the differences between SynchronousQueue and LinkedBlockingQueue

0

SynchronousQueue निम्नलिखित प्रमुख मतभेद के साथ इसी तरह से काम करता है: 1) SynchronousQueue का आकार 0 2) डाल() विधि केवल एक तत्व सम्मिलित करेंगे, तो ले() विधि को लाने के लिए है कि सक्षम हो जाएगा एक ही पल में कतार से तत्व यानी उपभोक्ता को() कॉल को उपभोग करने के लिए कुछ समय लगने पर तत्व को सम्मिलित नहीं किया जा सकता है।

सिंक्रोनस क्यूई - केवल तब ही डालें जब कोई उस पल में ही प्राप्त करेगा।

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