volatile
स्मृति से फिर से आदेश दिया जा रहा लिखते रोकता है, सिंगलटन के पॉइंटर के माध्यम से आपके सिंगलटन के अनियमित क्षेत्रों को पढ़ने के लिए अन्य धागे के लिए असंभव बनाना।
इस स्थिति पर विचार करें: थ्रेड ए uniqueInstance == null
, ताले की खोज करता है, यह पुष्टि करता है कि यह अभी भी null
है, और सिंगलटन के कन्स्ट्रक्टर को कॉल करता है। कन्स्ट्रक्टर सिंगलटन के अंदर सदस्य XYZ
में लिखता है, और रिटर्न देता है। थ्रेड ए अब नव निर्मित सिंगलटन के संदर्भ को uniqueInstance
में संदर्भित करता है, और इसके लॉक को रिलीज़ करने के लिए तैयार हो जाता है।
जैसे ही थ्रेड ए लॉक को रिलीज़ करने के लिए तैयार हो जाता है, थ्रेड बी साथ आता है, और पता चलता है कि uniqueInstance
null
नहीं है। थ्रेड B
uniqueInstance.XYZ
तक पहुंचता है यह सोच रहा है कि इसे प्रारंभ किया गया है, लेकिन क्योंकि सीपीयू ने फिर से लिखा है, इसलिए डेटा XYZ
में लिखा गया डेटा थ्रेड बी के लिए दृश्यमान नहीं किया गया है। इसलिए, थ्रेड बी XYZ
के अंदर एक गलत मान देखता है, जो कि है गलत।
जब आप uniqueInstance
अस्थिर चिह्नित करते हैं, तो मेमोरी बाrier डाला जाता है। uniqueInstance
से पहले शुरू किए गए सभी लेखन uniqueInstance
से पहले संशोधित किया जाएगा, ऊपर वर्णित पुनरावृत्ति स्थिति को रोकना।
संबंधित पोस्ट [यहां] (https : //stackoverflow.com/q/18093735/465053) और [यहां] (https://stackoverflow.com/q/12316406/465053) क्यों पहली जगह में डबल चेकिंग की आवश्यकता है। विकिपीडिया – RBT