http://csharpindepth.com/Articles/General/Singleton.aspx परसंभव डुप्लिकेट:
Is the C# static constructor thread safe?स्टेटिक प्रारंभिक सिंगलटन थ्रेड सुरक्षा की गारंटी देता है? (सी #)
जॉन स्कीट उत्तम लेख और अन्य लेख मैं यह स्पष्ट है कि कि दोबारा जांच लॉकिंग में काम नहीं करता बनाने पढ़ा है सी # और जावा दोनों जब तक कोई स्पष्ट रूप से उदाहरण को "अस्थिर" के रूप में चिह्नित नहीं करता है। यदि आप नहीं करते हैं, तो इसे तुलना करने की जांच संभवतः झूठी हो सकती है भले ही इंस्टेंस कन्स्ट्रक्टर चलाना समाप्त नहीं हो गया हो। श्री स्कीट के तीसरे नमूने में, वह यह स्पष्ट रूप से बताता है: "जावा मेमोरी मॉडल यह सुनिश्चित नहीं करता है कि नए ऑब्जेक्ट के संदर्भ से पहले कन्स्ट्रक्टर पूर्ण हो जाता है। उदाहरण के लिए जावा मेमोरी मॉडल को वर्किंग 1.5 के लिए पुनर्विक्रय किया गया है, लेकिन डबल -केक लॉकिंग अभी भी एक अस्थिर परिवर्तनीय (सी # में) के बिना टूटा हुआ है "
हालांकि, अधिकांश लोग सहमत हैं (श्री स्कीट सहित, उनके लेख में चार और पांच नमूने में), स्थिर प्रारंभिक उपयोग का उपयोग है थ्रेडसेफ सिंगलटन उदाहरण प्राप्त करने का एक आसान तरीका। वह कहता है कि "सी # में स्थैतिक रचनाकार केवल तभी निष्पादित करने के लिए निर्दिष्ट किए जाते हैं जब कक्षा का एक उदाहरण बनाया जाता है या एक स्थिर सदस्य का संदर्भ दिया जाता है, और प्रति एपडोमेन में केवल एक बार निष्पादित किया जाता है।"
यह समझ में आता है, लेकिन जो गुम हो रहा है वह गारंटी है कि नए ऑब्जेक्ट का संदर्भ केवल कन्स्ट्रक्टर पूरा होने के बाद ही सौंपा गया है - अन्यथा हमें एक ही तरह का मुद्दा मिल जाएगा जो डबल-चेक लॉकिंग विफल करता है आप आवृत्ति को अस्थिर के रूप में चिह्नित करते हैं। क्या कोई गारंटी है कि, इंस्टेंस कन्स्ट्रक्टर को कॉल करने के लिए स्थिर प्रारंभिकरण का उपयोग करते समय (एक प्रॉपर्टी के प्राप्त होने वाले इंस्टेंस कन्स्ट्रक्टर को कॉल करने के विपरीत {}, जैसे कि हम डबल-चेक लॉकिंग के साथ करते हैं), कि कन्स्ट्रक्टर किसी अन्य थ्रेड से पहले पूरी तरह से पूरा हो जाएगा वस्तु का संदर्भ प्राप्त कर सकते हैं?
धन्यवाद!
(टिप्पणी का जवाब दिया) –