केवल जावा 5 और ऊपर। एक मल्टीप्रोसेसर साझा-मेमोरी कंप्यूटर मानें (आप शायद अभी एक का उपयोग कर रहे हैं)।जावा सिंक्रनाइज़ किए गए कीवर्ड कैश को फ्लश करता है?
यहाँ एक सिंगलटन के आलसी आरंभीकरण के लिए एक कोड है:
public final class MySingleton {
private static MySingleton instance = null;
private MySingleton() { }
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
}
instance
volatile
आदेश getInstance() के रूप में (फिर से लिखने से अनुकूलक को रोकने के लिए जो एक अनुक्रमिक में सही होगा में घोषित किया जाना है क्या कार्यक्रम):
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
// instance must be null or we wouldn't be here (WRONG!)
instance = new MySingleton();
}
}
}
अनुकूलक मान लिया जाये कि अगर instance
volatile
घोषित नहीं किया गया है, कोड पुनर्लेखन नहीं है कि यह अभी भी याद करने के लिए प्लावित होने की गारंटी है जब synchronized
ब्लॉक बाहर निकला है, और synchronized
ब्लॉक दर्ज किया गया है, तो स्मृति से पढ़ें?
संपादित करें: मैं getInstance() स्थिर बनाने के लिए भूल गया था। मुझे नहीं लगता कि उत्तर की वैधता में परिवर्तन होता है; आप सब जानते थे कि मेरा क्या मतलब था।
संकेत: आप कोड को अलग करने के लिए 'javap -c com.example.ClassName' का उपयोग कर सकते हैं ताकि आप यह जांच सकें कि इसे कैसे संकलित किया गया है और यदि संकलक ने एक या दूसरे को बदल दिया/अनुकूलित किया है। मैंने जेडीके 1.6 में से एक के साथ यह आपके लिए जांच की है और कंपाइलर ने नेस्टेड 'if' को नहीं हटाया है। – BalusC
जावप का उपयोग करना दिलचस्प है, लेकिन जावैक में ऑप्टिमाइज़र आमतौर पर बहुत खराब होता है। जान - बूझकर। वास्तविक अनुकूलक रनटाइम पर जेआईटी कंपाइलर में है। – Darron
मैं केवल उत्तर में से एक को "उत्तर" के रूप में जांचने के लिए क्षमा चाहता हूं। उन सभी को अभी तक चेक करने के लायक हैं, लेकिन यह केवल मुझे एक की जांच करने देता है। –