पहला - अधिकांश वर्गों को थ्रेड-सुरक्षित होने की आवश्यकता नहीं होगी। YAGNI का उपयोग करें : केवल थ्रेड-सुरक्षा लागू करें जब आप जानते हैं कि आप वास्तव में इसका उपयोग करने जा रहे हैं (और इसका परीक्षण करें)।
विधि-स्तरीय सामग्री के लिए, वहाँ है [MethodImpl]
:
[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}
इसका उपयोग एक्सेसर्स (गुणों और घटनाओं) पर भी किया जा सकता है:
private int i;
public int SomeProperty
{
[MethodImpl(MethodImplOptions.Synchronized)]
get { return i; }
[MethodImpl(MethodImplOptions.Synchronized)]
set { i = value; }
}
ध्यान दें कि घटनाओं की तरह क्षेत्र रहे हैं , डिफ़ॉल्ट रूप से सिंक्रनाइज़ जबकि ऑटो कार्यान्वित गुण नहीं हैं :
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized
व्यक्तिगत रूप से, मैं के कार्यान्वयन पसंद नहीं MethodImpl
यह ताले के रूप में this
या typeof(Foo)
जो सबसे अच्छा अभ्यास के खिलाफ है -। पसंदीदा विकल्प अपने स्वयं के ताले का उपयोग करना है:
private readonly object syncLock = new object();
public void SomeMethod() {
lock(syncLock) { /* code */ }
}
ध्यान दें कि फ़ील्ड जैसी घटनाओं के लिए, लॉकिंग कार्यान्वयन कंपाइलर पर निर्भर है; पुराने Microsoft संकलक में यह एक lock(this)
/ lock(Type)
- है, हालांकि, अधिक हाल के संकलक में यहInterlocked
अपडेट का उपयोग करता है - इसलिए थ्रेड-सेफ बिना गंदा भागों के।
यह अधिक दानेदार उपयोग की अनुमति देता है, और धागे के बीच संवाद करने के लिए Monitor.Wait
/ Monitor.Pulse
आदि के उपयोग की अनुमति देता है ।
एक संबंधित ब्लॉग प्रविष्टि (बाद में पुनरीक्षित )।