दोनों int
और string
इस विधि में पैरामीटर के रूप में प्रभावी रूप से अपरिवर्तनीय हैं और बाहर कोड से नहीं बदला जा सकता।
इसलिए इस मामले में Format विधि याके साथ थ्रेड-सुरक्षा की परवाह करने की आवश्यकता नहीं है।
लेकिन हमें लगता है कि हम कुछ वर्ग MyObject कि परिवर्तनशील है और बाहर से बदला जा सकता है डालते हैं:
public class MyClass
{
public Int32 value1 { get; set; }
public String value2 { get; set;}
}
public static string WriteResult2(MyObject obj)
{
return "Result: value=" + obj.value1 + " name=" + obj.value2 ;
}
इस मामले में पहले दृष्टिकोण के साथ या दूसरी है कि क्या आप असंगत मूल्य लौट सकते हैं (यह एक मान पहले से ही आउटपुट में डाल दिए जाने के बाद वैल्यू 1 और वैल्यू 2 बदल दिए गए हैं।)
@JonSkeet pointed के रूप में यह असल में विधि नहीं है जो असुरक्षित है, लेकिन कक्षा अलग-अलग धागे के बीच इस तरह से साझा करने के लिए असुरक्षित है ।
इस स्थिति आप या तो विशेष धागे की सुरक्षित उदाहरण विधि बनाना पड़ेगा संभाल करने के लिए:
public class MyClass
{
private Object lockObj = new Object();
public Int32 value1
{
get
{
lock (this.lockObj) { ... });
}
set
{
lock (this.lockObj) { ... });
}
}
public String value2
{
get
{
lock (this.lockObj) { ... });
}
set
{
lock (this.lockObj) { ... });
}
}
public string WriteResult2()
{
lock (this.lockObj)
{
return "Result: value=" + this.value1 + " name=" + this.value2 ;
}
}
}
या तरीकों कि इसका इस्तेमाल में ऐसे मामलों पर कुछ अतिरिक्त लॉकिंग का उपयोग करें। पहला इन-क्लास दृष्टिकोण स्पष्ट रूप से कम त्रुटि-प्रवण है, लेकिन प्रदर्शन को कम कर सकता है और बहुत सारे बॉयलर-प्लेट कोड बना सकता है। आदर्श रूप से, समवर्ती प्रोग्रामिंग में आपको साझा परिवर्तनीय स्थिति और इसकी स्थिरता the better के बारे में परवाह करने की आवश्यकता कम होती है।
स्रोत
2015-05-08 09:46:55
मैं यह नहीं कहूंगा कि आपका बाद का मामला * विधि * थ्रेड-असुरक्षित बनाता है - यह * थ्रेड * (माइक्लास) असुरक्षित बनाता है जो एकाधिक धागे के बीच उदाहरण साझा करने के लिए असुरक्षित बनाता है, जो आईएमओ थोड़ा अलग मामला है। –
आपका "थ्रेड-सुरक्षित" संस्करण वास्तव में थ्रेड-सुरक्षित नहीं है ... क्योंकि कोई अन्य थ्रेड लॉक प्राप्त किए बिना 'value1' और' value2' को संशोधित कर सकता है। –
@ जोन्सकेट धन्यवाद। ताले जोड़ने के लिए भूल गए। –