मुझे नहीं लगता कि किसी ने वास्तव में सवाल का जवाब दिया है , इसलिए मैं इसे आज़माऊंगा।
अस्थिर और पहले if (instance == null)
"आवश्यक" नहीं हैं। लॉक इस कोड को थ्रेड-सुरक्षित बना देगा।
तो सवाल यह है: आप पहले क्यों जोड़ेंगे if (instance == null)
?
कारण संभवतः कोड के बंद खंड को अनावश्यक रूप से निष्पादित करने से बचना है। जब आप लॉक के अंदर कोड निष्पादित कर रहे होते हैं, तो कोई भी अन्य धागा जो उस कोड को निष्पादित करने की कोशिश करता है, वह ब्लॉक हो जाता है, जो कई थ्रेड्स से अक्सर सिंगलटन को एक्सेस करने का प्रयास करने पर आपके प्रोग्राम को धीमा कर देगा। भाषा / मंच के आधार पर, लॉक से ओवरहेड्स भी हो सकते हैं जिनसे आप बचना चाहते हैं।
तो पहले अशक्त जांच को वास्तव में त्वरित तरीके से जोड़ा जाता है ताकि आपको लॉक की आवश्यकता हो। यदि आपको सिंगलटन बनाने की आवश्यकता नहीं है, तो आप लॉक से पूरी तरह से बच सकते हैं।
लेकिन आप यह नहीं देख सकते हैं कि यह संदर्भ किसी तरह से लॉक किए बिना अशक्त है, क्योंकि प्रोसेसर कैशिंग के कारण, एक और धागा इसे बदल सकता है और आप एक "बासी" मूल्य पढ़ेंगे जो आपको अनावश्यक रूप से लॉक दर्ज करने के लिए प्रेरित करेगा। लेकिन आप एक लॉक से बचने की कोशिश कर रहे हैं!
इसलिए आप यह सुनिश्चित करने के लिए सिंगलटन को अस्थिर करते हैं कि आप नवीनतम मूल्य को पढ़ते हैं, बिना लॉक का उपयोग किए बिना।
आपको अभी भी आंतरिक लॉक की आवश्यकता है क्योंकि अस्थिर केवल चर तक पहुंच के दौरान आपकी रक्षा करता है - आप लॉक का उपयोग किए बिना इसे सुरक्षित रूप से परीक्षण और सेट नहीं कर सकते।
अब, क्या यह वास्तव में उपयोगी है?
वैसे मैं कहूंगा "ज्यादातर मामलों में, नहीं"।
यदि सिंगलटन.संबंध ताले की वजह से अक्षमता पैदा कर सकता है, तो आप इसे इतनी बार क्यों बुला रहे हैं कि यह एक महत्वपूर्ण समस्या होगी ? एक सिंगलटन का पूरा बिंदु यह है कि केवल एक ही है, इसलिए आपका कोड एक बार सिंगलटन संदर्भ को पढ़ और कैश कर सकता है।
केवल एक ही मामला मैं सोच सकता हूं कि यह कैशिंग संभव नहीं होगा जब आपके पास बड़ी संख्या में धागे होंगे (उदाहरण के लिए हर अनुरोध को संसाधित करने के लिए एक नया थ्रेड का उपयोग करने वाला सर्वर लाखों बहुत कम चलने वाले धागे बना सकता है, प्रत्येक जिसे सिंगलटन कहना होगा। एक बार)।
इसलिए मुझे संदेह है कि डबल चेक्ड लॉकिंग एक ऐसा तंत्र है जिसमें बहुत विशिष्ट प्रदर्शन-महत्वपूर्ण मामलों में एक वास्तविक स्थान है, और फिर हर कोई "यह करने के लिए उचित तरीका है" पर चढ़ गया है, वास्तव में यह क्या करता है और क्या नहीं, यह सोचने के बिना। वास्तव में उस मामले में आवश्यक होगा जो वे इसके लिए उपयोग कर रहे हैं।