2009-07-15 16 views
20

मेरे पास ऑब्जेक्ट कैश है जो सिंगलटन डिज़ाइन पैटर्न लागू करता है। सिंगलटन के लिए मेरा दृष्टिकोण हमेशा संपत्ति के पहले पहुंचने पर स्थिर उदाहरण को आलसी लोड करना था।स्टेटिक कन्स्ट्रक्टर और सिंगलटन क्लास

public static Widget 
{ 
    get 
    { 
     if(instance==null) instance = new Widget(); 
     return instance; 
    } 
} 

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

जैसा कि मैं इसे समझता हूं, स्थिर स्थिरता का उपयोग तब भी किया जाएगा जब पहली स्थिर संपत्ति पहुंच होती है। क्या यह मान्य है, और क्या यह वर्तमान आलसी लोड दृष्टिकोण पर कोई लाभ प्रदान करेगा या क्या यह प्रॉक्सी कार्यान्वयन का पता लगाने के लिए बेहतर होगा, या इसे ताला सुरक्षित रखने के लिए मजबूर करने के लिए लॉक का उपयोग करना बेहतर होगा?

public static Widget 
    { 
     get 
     { 
      if(instance==null) 
      { 
       lock(padlock) 
       { 
        if(instance==null) instance = new Widget(); 
       } 
      } 
      return instance; 
     } 
    } 

मैं स्थिर कंस्ट्रक्टर्स के साथ अनुभव की एक पूरी बहुत कुछ नहीं है, इसलिए यदि यह आलसी लोड संपत्ति के बराबर या बुरा कार्यान्वयन है इस विचार के साथ में छलांग नहीं करना चाहता।

चीयर्स, गैरी

+1

मेरा मानना ​​है कि इस क्यू एंड ए धागा आप दे देंगे आप क्या चाहते हैं: http://stackoverflow.com/questions/246710/how-to-implement-a-singleton-in-c –

उत्तर

17

जॉन स्कीट इस मुद्दे पर चर्चा एकमात्र पर एक अच्छी article है।

+0

इस के साथ अच्छी तरह से काम आईओसी कंटेनर भी: http://www.tavaresstudios.com/Blog/post/Resolving-a-Singleton-Hres-how.aspx –

+0

लिंक को http://csharpindepth.com/Articles/General/Singleton पर अपडेट किया जाना चाहिए। aspx – Dorus

2

अपने स्वयं के थ्रेडसेफ आलसी प्रारंभकर्ता को रोल करने और संभवतः इसे गलत करने के बजाय, मैं बस जो डफी के आलसी प्रारंभकर्ता वर्ग का उपयोग करने की सलाह देता हूं।

http://www.bluebytesoftware.com/blog/PermaLink,guid,a2787ef6-ade6-4818-846a-2b2fd8bb752b.aspx

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