मेरे पास एक कस्टम क्लास है जो ICollection
लागू करती है, और यह कक्षा केवल पढ़ने योग्य है, यानी। IsReadOnly
सत्य लौटाता है (readonly
कीवर्ड का उपयोग करने के विपरीत), और सभी फ़ंक्शंस जो संग्रह में डेटा को सामान्य रूप से संशोधित करते हैं InvalidOperationException
के फेंक देते हैं।आईसीओलेक्शन, रीडोनली संग्रह, और सिंक्रनाइज़ेशन। क्या यह सही है?
अब, ICollection
(विशेष रूप से ICollection.IsSynchronized
और दोस्तों) को लागू करते समय थ्रेड-सुरक्षा समस्याओं पर एक ऐसा निर्माण, और त्वरित स्कीम दिया गया, मैं इस त्वरित और गंदे समाधान के साथ आया।
bool ICollection.IsSynchronised { get{ return true; } }
object ICollection.SyncRoot { get{ return new Object(); } }
अब, MSDN में उदाहरण दिया, इस अलग धागे ठीक से लॉक करने के लिए, क्योंकि वे SyncRoot
से विभिन्न वस्तुओं हो रही है पैदा नहीं होगी। यह देखते हुए कि यह एक पठनीय संग्रह है, क्या यह एक मुद्दा है? क्या new Object()
लौटने के साथ मेमोरी/जीसी मुद्दे हैं? इस कार्यान्वयन के साथ आप देख सकते हैं कि कोई अन्य समस्या?
संग्रह प्रभावशाली है, इसे संशोधित करने का कोई तरीका नहीं है (कोर्स के प्रतिबिंब में चारों ओर खुदाई करने के लिए सहेजें), इसलिए इन सभी प्रकार की चीजों की गारंटी दी जानी चाहिए? –
ध्यान दें कि आपके क्लाइंट यह नहीं जानते कि उन्हें एक अपरिवर्तनीय संग्रह मिल रहा है। जाहिर है, वे इसे संशोधित करने की कोशिश नहीं कर रहे हैं (या उन्हें पहले से ही एक त्रुटि मिल जाएगी) लेकिन वे यह सुनिश्चित करने के लिए लॉक हो सकते हैं कि अगर वे एक परिवर्तनीय संग्रह प्रदान किए गए तो वे असफल नहीं होंगे। –
हां, ठीक है, वे सिंक्रूट को कॉल करते हैं, किसी ऑब्जेक्ट को लॉक करने के लिए प्राप्त करते हैं, एक ऑब्जेक्ट जिसे कोई और कभी नहीं मिलेगा, इसलिए लॉक बेकार है। लेकिन क्या हमें वास्तव में अनावश्यक रूप से अन्य धागे पकड़ना चाहिए? –