डबल-चेकिंग लॉकिंग। सब मिलाकर।
प्रतिमान, जिसे मैंने बीईए में काम करते समय समस्याओं को सीखना शुरू किया था, यह है कि लोग निम्नलिखित तरीके से एक सिंगलटन की जांच करेंगे:
public Class MySingleton {
private static MySingleton s_instance;
public static MySingleton getInstance() {
if(s_instance == null) {
synchronized(MySingleton.class) { s_instance = new MySingleton(); }
}
return s_instance;
}
}
यह कभी काम नहीं करता है, क्योंकि एक और धागा सिंक्रनाइज़ेशन ब्लॉक में मिल सकता है और s_instance अब शून्य नहीं है। तो प्राकृतिक परिवर्तन तो इसे बनाने के लिए है:
public static MySingleton getInstance() {
if(s_instance == null) {
synchronized(MySingleton.class) {
if(s_instance == null) s_instance = new MySingleton();
}
}
return s_instance;
}
यह या तो काम नहीं करता है, क्योंकि जावा मेमोरी मॉडल इसका समर्थन नहीं करता है। आपको इसे काम करने के लिए s_instance को अस्थिर घोषित करने की आवश्यकता है, और तब भी यह केवल जावा 5 पर काम करता है।
जो लोग जावा मेमोरी मॉडल की पेचीदगियों से परिचित नहीं हैं वे हर समय इसे गड़बड़ करते हैं ।