यह प्रश्न एक बेहतर उत्तर का हकदार है।
जावा के गैर-अवरोधक लॉक-फ्री कतारों के लिए Maged M. Michael और Michael L. Scott द्वाराConcurrentLinkedQueue
प्रसिद्ध एल्गोरिथम पर आधारित है ।
किसी कंट्रोल्ड रिसोर्स (हमारी कतार) के लिए एक शब्द के रूप में "नॉन-ब्लॉकिंग" का मतलब है कि प्लेटफ़ॉर्म के शेड्यूलर चाहे जो भी कर रहा हो, जैसे कि एक थ्रेड को बाधित करना, या यदि प्रश्न में थ्रेड बहुत धीमा है, तो उसी संसाधन के लिए अन्य थ्रेड्स लड़ रहे हैं। अभी भी प्रगति करने में सक्षम होगा। यदि कोई ताला उदाहरण के लिए शामिल किया जाता है, तो ताला पकड़े हुए धागे को बाधित किया जा सकता है और उस ताला के इंतजार में सभी धागे अवरुद्ध हो जाएंगे। synchronized
जावा में आंतरिक लॉक ( कीवर्ड) प्रदर्शन के लिए एक गंभीर दंड के साथ भी आ सकता है - जैसे कि पक्षपाती लॉकिंगइसमें शामिल है और आपके पास विवाद है, या जब वीएम एक ग्रेस ग्रेस पीरियड के बाद लॉक को "इनफ्लो" करने का फैसला करता है और कंटेस्टेंट थ्रेड्स को ब्लॉक कर देता है ... यही वजह है कि कई संदर्भों में (निम्न / मध्यम विवाद के परिदृश्य), तुलना करते-करते परमाणु संदर्भों पर सेट बहुत अधिक कुशल हो सकते हैं और यह वास्तव में कई गैर-अवरुद्ध डेटा-संरचनाएं कर रहे हैं।
जावा ConcurrentLinkedQueue
केवल नॉन-ब्लॉकिंग नहीं है, लेकिन इसमें भयानक संपत्ति है कि निर्माता उपभोक्ता के साथ संघर्ष नहीं करता है। एक एकल निर्माता / एकल उपभोक्ता परिदृश्य (एसपीएससी) में, इसका वास्तव में मतलब है कि बोलने का कोई विवाद नहीं होगा। एक से अधिक निर्माता / एकल उपभोक्ता परिदृश्य में, उपभोक्ता उत्पादकों के साथ संघर्ष नहीं करेगा। जब कई निर्माता प्रयास करते हैं offer()
, तो यह कतार विवाद होती है , लेकिन यह परिभाषा द्वारा संक्षिप्त है। यह मूल रूप से एक सामान्य उद्देश्य और कुशल गैर-अवरुद्ध कतार है।
जैसा कि यह नहीं किया जा रहा है BlockingQueue
, ठीक है, कतार पर प्रतीक्षा करने के लिए एक धागा को अवरुद्ध करना समवर्ती प्रणालियों को डिजाइन करने का एक भयावह रूप से भयानक तरीका है। मत करो। यदि आप ConcurrentLinkedQueue
किसी उपभोक्ता / निर्माता परिदृश्य में उपयोग करने का तरीका नहीं जान सकते हैं, तो एक अच्छे अभिनेता ढांचे की तरह उच्च-स्तरीय अमूर्त में स्विच करें।