सी # में, निम्न कोड (this पेज से) lazily एक धागा सुरक्षित रास्ते में एक सिंगलटन वर्ग का दृष्टांत के लिए इस्तेमाल किया जा सकता है:डेल्फी में "डबल-चेक लॉकिंग" को कैसे लागू किया जाना चाहिए?
class Foo {
private volatile Helper helper = null;
public Helper getHelper() {
if (helper == null) {
lock(this) {
if (helper == null)
helper = new Helper();
}
}
return helper;
}
}
क्या बराबर धागा सुरक्षित डेल्फी कोड हो सकता है?
लेख में यह भी डबल के साथ दो समस्याओं का उल्लेख है जावा में लॉक करना जाँच:
- यह संभव है कि नई वस्तु से पहले सहायक संदर्भ नव निर्मित जिसका अर्थ है कि वस्तु पर बात करने के लिए किया जाता है का निर्माण किया है दो वस्तुओं बनाई गई हैं
- यह संभव है कि सहायक संदर्भ स्मृति का एक ब्लॉक पर बात करने के लिए है, जबकि अभी भी वस्तु जिसका अर्थ है कि एक अधूरी ऑब्जेक्ट के संदर्भ लौटा दी जाएगी बनाया जा रहा है बना है
इसलिए जब सी # का कोड और उल्लेख किया लेख में जावा संस्करण लगभग समान लग रहे हैं, केवल सी # संस्करण के रूप में उम्मीद काम करता है। जो अतिरिक्त प्रश्न की ओर जाता है यदि डबल-चेक किए गए लॉकिंग के डेल्फी संस्करण में ये दो समस्याएं भी मौजूद हैं?
मैं इसे बेहतर नहीं कह सकता था ;-) –
मुझे यह महसूस हो रहा है कि इस कोड में कुछ आवश्यक है: सी # कार्यान्वयन निजी हेल्पर चर के लिए 'अस्थिर' कीवर्ड का उपयोग करता है। मुझे लगता है कि FHelper ** ** को 'थ्रेडवर 'के रूप में घोषित किया जाना चाहिए? – mjn
थ्रेडवार के परिणामस्वरूप सभी धागे द्वारा साझा किए गए सिंगलटन की बजाय एक प्रति थ्रेड होगा। अस्थिर .net स्मृति मॉडल के कारण हो सकता है। लेकिन उपरोक्त कोड x86 पर सही है। –