2011-04-15 11 views
5

मैं एक वर्ग की तलाश कर रहा था ताकि एक ही कक्षा के थ्रेड-सुरक्षित और असुरक्षित संस्करण दोनों प्रदान किए जा सकें। इसके तकनीकी पहलू बहुत स्पष्ट हैं। मैं नामकरण/पहुँच सम्मेलनों आदि को खोजने के लिए उम्मीद कर रही थी लगता है ...इस नेट का लाभ क्या है

तो मैं 'Systems.Collections' नाम स्थान में हर जगह इस पैटर्न को खोजने:

public class WhatEv 
{ 
    private class SyncWhatEv : WhatEv 
    { 
     // overrides IsSyncronized = true 
     // overrides whatever else to make it thread safe 
    } 

    public virtual bool IsSynchronized 
    { 
     get { return false; } 
    } 

    public static WhatEv Synchronized(WhatEv whatEv) 
    { 
     return new SyncWhatEv(whatEv); 
    } 
} 

वर्गों है कि यह लागू की एक संख्या हैं: हैशटेबल, कतार, ऐरेलिस्ट, ढेर, आदि ... मैं विरासत को समझता हूं। लेकिन इसे एक निजी, नेस्टेड क्लास क्यों बनाते हैं और उपयोगकर्ता इसे प्राप्त करने के लिए एक उछाल से कूदते हैं? क्या इस तरह से ऐसा करने के लिए कोई फायदा है?

+0

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

+0

यदि आप इसे दो धागे से एक्सेस कर रहे हैं, तो दोनों को एक ही सिंक्रनाइज़ किए गए इंस्टेंस का उपयोग करने की आवश्यकता है। आप रिसीवर को सिंक्रनाइज़ किए गए इंस्टेंस का उपयोग नहीं कर सकते हैं, और मुख्य धागा गैर-सिंक किए गए संस्करण का उपयोग करता है। तो यदि किसी अन्य धागे द्वारा ऑब्जेक्ट का उपयोग करने का कोई मौका है, तो इसे सिंक्रनाइज़ किया जाना चाहिए। लेकिन एक संभावित समस्या के लिए जोएल का जवाब देखें। – CodeNaked

+0

@ नग्न - सहमत। लेकिन SyncWhatEv व्हाट्सएव विरासत में आता है। तो SyncWhatEv का एक ही उदाहरण मुख्य थ्रेड पर व्हाटएव टाइप के रूप में उपयोग किया जा सकता है और वर्क थ्रेड द्वारा सिंकवैटईवी प्रकार के रूप में आवश्यक है। केवल, यह संभव नहीं है क्योंकि SyncWhatEv निजी है। वर्तमान में थ्रेड को IsSynchronized को दोबारा जांचना होगा और गलत होने पर फेंकना होगा। – TBone

उत्तर

-1

सप्ताहांत के लिए इसे सोचने के बाद, और कोई और प्रतिक्रिया प्राप्त करने के बाद। मैंने फैसला किया है कि जवाब है: एमएस पागल हो। ऑब्जेक्ट का सिंक्रनाइज़ संस्करण प्रदान करने का पूरा बिंदु थ्रेड सुरक्षा के लिए है, फिर भी ऑब्जेक्ट के थ्रेड सुरक्षित संस्करण की आवश्यकता के लिए एक थ्रेड को संकलित समय पर कोई रास्ता नहीं है। इस ऑब्जेक्ट का सत्यापन रनटाइम पर होना चाहिए, जो ... बोगस है।

उनके इनपुट के लिए सभी को धन्यवाद। मैं इसकी सराहना करता हूं।

+0

लवली। ए -1 किसी कारण के लिए। अगर मैं सही नहीं हूं, तो मुझे दिखाएं कि मैं गलत कैसे हूं। – TBone

3

ज्यादातर मामलों में, ऑब्जेक्ट का धागा-सुरक्षित संस्करण (यानी हैशटेबल, कतार) की आवश्यकता नहीं है। इसलिए, डिफ़ॉल्ट रूप से इसे थ्रेड-सुरक्षित बनाने के लिए आवश्यक ओवरहेड जोड़ने का अर्थ नहीं है। सिंक्रनाइज़ विधि का उपयोग करने से, उन उपयोगकर्ताओं को अनुमति मिलती है जिन्हें थ्रेड-सुरक्षित संस्करण प्राप्त करने के लिए थ्रेड-सुरक्षा की आवश्यकता होती है।

ऑब्जेक्ट का सिंक्रनाइज़ संस्करण, थ्रेड-सुरक्षा के अलावा कोई अतिरिक्त कार्यक्षमता नहीं जोड़ता है। वे किसी भी नए सदस्यों का पर्दाफाश नहीं करते हैं, न ही उनके अंतर्निहित प्रकार को जानने में वास्तव में मदद करते हैं। इसलिए उन्हें निजी/बस अपनी सार्वजनिक/बेस क्लास की तरह "देखो" बनाया जाता है।

+0

यदि आप थ्रेड सुरक्षित संस्करण बनाने की कीमत पर जा रहे हैं तो गैर-थ्रेसाफ संस्करण के साथ क्यों न दें और केवल एक संस्करण बनाए रखें? – BenCr

+0

@BenCr - क्योंकि थ्रेड-सुरक्षा सुनिश्चित करने के लिए एक प्रदर्शन हिट है। जैसा कि मैंने कहा, आम तौर पर ज्यादातर मामलों में थ्रेड-सुरक्षा की आवश्यकता नहीं होती है, लेकिन जब आप करते हैं तो यह वहां होता है। इसके अलावा, जिस तरह से सबसे अधिक कोड किया जाता है, आप आमतौर पर हैशटेबल में कुछ ठीक कर सकते हैं और इसे निजी थ्रेड-सुरक्षित संस्करण में भी ठीक किया जाएगा। चूंकि उत्तरार्द्ध केवल यह सुनिश्चित करने के लिए चिंतित है कि उपयुक्त ताले प्राप्त किए जाते हैं। – CodeNaked

+0

@ बेनक्रा, मैं सुन रहा हूं कि आप क्या कह रहे हैं। मैं लॉक की प्रदर्शन लागत का अत्यधिक भरोसा नहीं कर रहा हूं, लेकिन मेरी कक्षा ऐसी चीज है जिसे एक थ्रेडेड संदर्भ में बड़े पैमाने पर इस्तेमाल किया जा सकता है और कभी-कभी थ्रेडेड संदर्भ में (जैसे कि अधिकांश कक्षाएं, मुझे यकीन है)। 9 0% समय की आवश्यकता नहीं होने पर सभी लॉकिंग के लिए ओवरकिल लगता है। – TBone

2

सिद्धांत रूप में, यह एक अच्छा विचार है, और @CodeNaked की अच्छी व्याख्या है। अभ्यास में, अभी भी इसके साथ समस्याएं हैं। उदाहरण के लिए, यदि आपको अपने थ्रेड-सुरक्षित वर्ग में 2 कॉल करने की आवश्यकता है और दोनों कॉलों के लिए थ्रेड सुरक्षा की आवश्यकता है, तो आपको अभी भी लॉक करने की आवश्यकता है। इस SO आइटम में अच्छी व्याख्या: In C# would it be better to use Queue.Synchronized or lock() for thread safety?

+0

उत्कृष्ट लिंक। मैं मानता हूं कि लॉकिंग करना खुद को जाने का एक और परिष्कृत तरीका है। मुझे अभी भी लगता है, एक पैटर्न के रूप में, यह सिर्फ मुझे समझ में नहीं आता है। – TBone

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