संपादित शुरू
अपने संपादित शीर्षक के आधार पर, अशक्त-कोलेसिंग ऑपरेटर ही (Phil Haack's analysis देखें) धागे की सुरक्षित हो रहा है। हालांकि, ऐसा लगता है कि यह स्ट्रिंगबिल्डर निर्माता को संभावित एकाधिक कॉल के खिलाफ गारंटी नहीं देता है।
अंत संपादित
आप सूत्रण के साथ एक बड़ा समस्या है, और कहा कि कि बिल्डर संपत्ति ही कहा गया है कि धागे भर में साझा किया जा सकता का प्रतिनिधित्व करता है। भले ही आप आलसी प्रारंभिक धागे को सुरक्षित बनाते हैं, फिर भी कोई गारंटी नहीं है कि बिल्डर का उपभोग करने वाले तरीके इसे थ्रेड सुरक्षित तरीके से कर रहे हैं।
// below code makes the getter thread safe
private object builderConstructionSynch = new object();
public StringBuilder Builder
{
get
{
lock (builderConstructionSynch)
{
if (_builder == null) _builder = new StringBuilder();
}
return _builder;
}
}
ऊपर _builder की आलसी आरंभीकरण में सूत्रण समस्या को रोकने जाएगा, लेकिन जब तक आप StringBuilder के कहने तरीकों को अपने कॉल सिंक्रनाइज़, आप किसी भी तरीके कि बिल्डर संपत्ति का उपभोग में धागा सुरक्षा की गारंटी नहीं कर रहे हैं। ऐसा इसलिए है क्योंकि स्ट्रिंगबिल्डर में इंस्टेंस विधियों को थ्रेड सुरक्षित नहीं बनाया गया था। नीचे दिए गए पाठ को MSDN StringBuilder page से देखें।
किसी भी सार्वजनिक स्थिर इस प्रकार के सदस्यों (दृश्य बेसिक में साझा) धागा सुरक्षित हैं। कोई भी उदाहरण सदस्य थ्रेड सुरक्षित होने की गारंटी नहीं है।
यदि आप कई धागे में स्ट्रिंगबिल्डर का उपभोग कर रहे हैं, तो संभवत: आप अपनी कक्षा में इसे बेहतर ढंग से समेकित कर सकते हैं। बिल्डर को निजी बनाएं और बेनकाब क्या व्यवहार आप एक सार्वजनिक विधि के रूप में की जरूरत है:
public void AppendString(string toAppend)
{
lock (Builder)
{
Builder.Append(toAppend);
}
}
इस तरह आप हर जगह तुल्यकालन कोड लिखने नहीं कर रहे हैं।
स्रोत
2009-06-03 13:19:29
सी # विनिर्देश ध्यान से कॉल करता है कि कौन से ऑपरेशन परमाणु हैं; नल coalescing ऑपरेटरों परमाणु नहीं हैं। नल कोलेसिंग ऑपरेटर कोड के पहले हिस्से के लिए सिर्फ एक वाक्य रचनात्मक चीनी है। लेकिन आपको यहां बड़ी समस्याएं हैं; कौन सा परवाह करता है अगर फ़ील्ड थ्रेडसेफ है? निर्माता थ्रेडसेफ नहीं है! –
इस नस में भविष्य के प्रश्नों के लिए, यदि आप वास्तव में "थ्रेड सुरक्षित" का अर्थ है, तो सावधानीपूर्वक परिभाषित परिभाषा प्रदान करने में यह मदद करेगा। थ्रेड सुरक्षा एक पूर्ण नहीं है; बल्कि, कोड थ्रेड सुरक्षित है यदि कॉलर्स द्वारा लागू अनुबंध अनुबंध कैली द्वारा अपेक्षित के साथ संगत है। यह जानने के बिना कि आप किस अनुबंध की अपेक्षा करते हैं, यह कहना असंभव है कि कोड इसका पालन करता है या नहीं। –