एक थ्रेड-सुरक्षित संग्रह बनाम एक गैर-थ्रेडसेफ़-संग्रह पर एक अलग तरीके से देखा जा सकता है।
चेकआउट को छोड़कर कोई क्लर्क के साथ स्टोर पर विचार करें। अगर लोगों ने जिम्मेदारी से काम नहीं किया तो आपके पास समस्याओं का एक टन है। उदाहरण के लिए, मान लें कि एक ग्राहक पिरामिड से कैन ले सकता है, जबकि एक क्लर्क वर्तमान में पिरामिड का निर्माण कर रहा है, सभी नरक ढीले हो जाएंगे। या, क्या होगा यदि दो ग्राहक एक ही समय में एक ही आइटम के लिए पहुंचते हैं, कौन जीतता है? क्या कोई लड़ाई होगी? यह एक गैर-सूत्र-संग्रह है। समस्याओं से बचने के लिए बहुत सारे तरीके हैं, लेकिन उन सभी को किसी न किसी तरह से लॉक करने की आवश्यकता होती है, या किसी अन्य तरीके से स्पष्ट रूप से पहुंच की आवश्यकता होती है।
दूसरी ओर, एक डेस्क पर क्लर्क के साथ एक स्टोर पर विचार करें, और आप केवल उसके माध्यम से खरीदारी कर सकते हैं। आप लाइन में लग जाते हैं, और उससे एक वस्तु मांगते हैं, वह उसे आपके पास वापस लाता है, और आप लाइन से बाहर जाते हैं। यदि आपको कई वस्तुओं की आवश्यकता है, तो आप प्रत्येक राउंडट्रिप पर केवल उतने ही आइटम उठा सकते हैं जितना आप याद कर सकते हैं, लेकिन आपको क्लर्क से बचने के लिए सावधानी बरतने की आवश्यकता है, इससे आपके पीछे के अन्य ग्राहक नाराज हो जाएंगे।
अब इस पर विचार करें। एक क्लर्क के साथ स्टोर में, क्या होगा अगर आपको लाइन के सामने का रास्ता मिल जाए, और क्लर्क से पूछें "क्या आपके पास कोई टॉयलेट पेपर है", और वह कहता है "हाँ", और फिर आप "ओके, आई 'जाओ। जब मुझे पता चलेगा कि मुझे आपकी आवश्यकता है, तो आप वापस आ जाएंगे, "तब तक आप पंक्ति में सबसे आगे होंगे, तब तक स्टोर को बेचा जा सकता है। इस परिदृश्य को थ्रेडसेफ़ संग्रह द्वारा रोका नहीं जाता है।
एक थ्रेडसेफ़ संग्रह की गारंटी देता है कि इसकी आंतरिक डेटा संरचनाएं हर समय मान्य हैं, भले ही कई थ्रेड्स से एक्सेस किया गया हो।
एक गैर-सूत्र संग्रह किसी भी ऐसी गारंटी के साथ नहीं आता है। उदाहरण के लिए, यदि आप एक धागे पर एक बाइनरी ट्री में कुछ जोड़ते हैं, जबकि एक और धागा पेड़ को पुन: संतुलित करने में व्यस्त है, तो कोई गारंटी नहीं है कि आइटम को जोड़ा जाएगा, या यहां तक कि पेड़ अभी भी वैध है, यह आशा से परे भ्रष्ट हो सकता है।
एक थ्रेडसेफ़ संग्रह हालांकि, गारंटी नहीं देता है कि थ्रेड पर अनुक्रमिक संचालन सभी इसकी आंतरिक डेटा संरचना के समान "स्नैपशॉट" पर काम करते हैं, जिसका अर्थ है कि यदि आपके पास इस तरह का कोड है:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
आपको NullReferenceException मिल सकती है क्योंकि Inbetween tree.Count
और tree.First()
, एक अन्य थ्रेड ने ट्री में शेष नोड्स को हटा दिया है, जिसका अर्थ है First()
कि वापस आ जाएगा null
।
इस परिदृश्य के लिए, आपको या तो यह देखना होगा कि क्या प्रश्न में संग्रह के लिए एक सुरक्षित तरीका है जो आप चाहते हैं, शायद आपको ऊपर दिए गए कोड को फिर से लिखना होगा, या आपको लॉक करने की आवश्यकता हो सकती है।