अक्सर, जब मैं एक वर्ग है जो धागे की सुरक्षित है चाहता हूँ, मैं निम्नलिखित की तरह कुछ कार्य करें:क्या यह सी # में थ्रेड-सेफ क्लासेस बनाने के लिए एक अच्छा डिजाइन है?
public class ThreadSafeClass
{
private readonly object theLock = new object();
private double propertyA;
public double PropertyA
{
get
{
lock (theLock)
{
return propertyA;
}
}
set
{
lock (theLock)
{
propertyA = value;
}
}
}
private double propertyB;
public double PropertyB
{
get
{
lock (theLock)
{
return propertyB;
}
}
set
{
lock (theLock)
{
propertyB = value;
}
}
}
public void SomeMethod()
{
lock (theLock)
{
PropertyA = 2.0 * PropertyB;
}
}
}
यह काम करता है, लेकिन यह बहुत वर्बोज़ है। कभी-कभी मैं प्रत्येक विधि और संपत्ति के लिए एक लॉक ऑब्जेक्ट भी बना देता हूं जो अधिक verbosity और जटिलता बनाते हैं।
मुझे पता है कि सिंक्रनाइज़ेशन विशेषता का उपयोग करके कक्षाओं को लॉक करना भी संभव है, लेकिन मुझे यकीन नहीं है कि स्केल कितनी अच्छी तरह से हैं - क्योंकि मुझे अक्सर लाखों नहीं होने की उम्मीद है, अगर थ्रेड-सुरक्षित के उदाहरण वस्तुओं। यह दृष्टिकोण कक्षा के प्रत्येक उदाहरण के लिए एक सिंक्रनाइज़ेशन संदर्भ बनाएगा, और कक्षा को ContextBoundObject से निकाला जाना चाहिए और इसलिए किसी अन्य चीज़ से नहीं लिया जा सकता है - क्योंकि सी # एकाधिक विरासत की अनुमति नहीं देता है - जो एक शो स्टॉपर है कई मामलों में।
संपादित करें: जैसा कि कई उत्तरदाताओं ने जोर दिया है, वहां कोई "चांदी बुलेट" धागा-सुरक्षित वर्ग डिज़ाइन नहीं है। मैं बस यह समझने की कोशिश कर रहा हूं कि मैं जिस पैटर्न का उपयोग कर रहा हूं वह अच्छे समाधानों में से एक है। बेशक किसी विशेष स्थिति में सबसे अच्छा समाधान समस्या निर्भर है। नीचे दिए गए कई उत्तरों में वैकल्पिक डिज़ाइन शामिल हैं जिन्हें माना जाना चाहिए।
संपादित करें: इसके अलावा, थ्रेड सुरक्षा की एक से अधिक परिभाषाएं हैं। उदाहरण के लिए, ऊपर मेरी कार्यान्वयन में, निम्न कोड नहीं धागा सुरक्षित होगा:
var myObject = new ThreadSafeClass();
myObject.PropertyA++; // NOT thread-safe
तो, ऊपर वर्ग परिभाषा एक अच्छा दृष्टिकोण का प्रतिनिधित्व करता है? यदि नहीं, तो आप समान व्यवहार वाले डिज़ाइन के लिए क्या अनुशंसा करेंगे जो उपयोग के समान सेट के लिए थ्रेड-सुरक्षित होगा?
कृपया पहले खोजें: http://stackoverflow.com/search?q=What+is+the+Best+Practice+for+ क्रिएटिंग + थ्रेड- Safe+Classes+in+C%23 –
एचएम। अपने कोड में, आप प्रॉपर्टीए और प्रॉपर्टीबी दोनों को पढ़ने के लिए एक ही लॉक ऑब्जेक्ट का उपयोग करते हैं। इसका मतलब है कि प्रॉपर्टीए पढ़ने वाला एक थ्रेड प्रॉपर्टीबी को पढ़ने की कोशिश कर रहा है जब तक कि पहला धागा पूरा न हो जाए। क्या तुम यही चाहते हो? अगर यह मेरी कक्षा थी, तो मैं प्रत्येक गेटर के लिए एक अलग पठन लॉकर बनाउंगा और फिर सेटर्स को उस लॉक का भी सम्मान करना होगा। नीचे एक उत्तर देखें। –
मैंने अभी आपको नीचे गिरा दिया क्योंकि थ्रेड-सुरक्षित वर्ग बनाने का कोई भी तरीका नहीं है। इस प्रश्न का कोई भी जवाब भविष्य के पाठकों को गलत इंप्रेशन देने का जोखिम उठाता है। –