2009-12-09 5 views
16

संभव डुप्लिकेट:
Difference between lock(locker) and lock(variable_which_I_am_using)ताले अलग वस्तुओं पर क्यों प्रदर्शन किए जाते हैं?

"धागा सुरक्षित" कोड उदाहरण मैं देखा है के सभी में, वे एक अलग डमी वस्तु पर ताला। सवाल में डेटा पर सीधे लॉक क्यों नहीं किया जा सकता है?

+0

अच्छा सवाल, यह मेरा पहला विचार भी था। – Russell

+1

लोगों को उत्तर खोजने में मदद करने के हित में वे इस प्रश्न की तलाश में नहीं हैं, उन्हें बंद नहीं किया जाना चाहिए। @ बिल, तथाकथित सटीक डुप्लिकेट प्रश्न अजीब शीर्षक और शब्द है और इस प्रश्न के विपरीत मौलिक प्रश्न स्पष्ट रूप से नहीं बताता है। मेरा मानना ​​है कि इस प्रश्न में खोजों पर ध्यान आकर्षित करने की संभावना अधिक है। इससे पहले कि मैंने फिर से खोलने के लिए मतदान किया है। – Ash

उत्तर

18

एक अलग private डमी ऑब्जेक्ट पर लॉकिंग आपको गारंटी देता है कि उस ऑब्जेक्ट में कोई और लॉक नहीं हो रहा है।

यदि आप डेटा को लॉक करते हैं और डेटा का एक ही टुकड़ा बाहर दिखाई देता है तो आप उस गारंटी को खो देते हैं। उदाहरण के लिए:

public class MyObject 
{ 
    public void SharedMethod() 
    { 
     lock (this) 
     { 
      // Do stuff 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyObject o = new MyObject(); 

     lock (o) 
     { 
      new Thread(() => 
      { 
       // Gets blocked 2s because of external lock 
       o.SharedMethod(); 
      }).Start(); 

      Thread.Sleep(2000); 
     } 
    } 
} 
+0

समस्या का अच्छा उदाहरण। – RichardOD

+0

मुझे लगता है कि मुझे यह मिल गया। यदि आपके पास एक अलग डमी ऑब्जेक्ट है तो उस ऑब्जेक्ट को लॉक करके जिसे आप उपयोग करना चाहते हैं, आप इसे कुछ भी करने से रोक नहीं रहे हैं? – RCIX

+0

मेरा मतलब है, जब आप उस ऑब्जेक्ट पर एक विधि कॉल करने का प्रयास करते हैं जिसे कुछ घड़ी की आवश्यकता होती है। – RCIX

2

एरिक गुनर्सन के ब्लॉग पर इस पर कुछ शानदार चीजें हैं। here और here देखें।

8

जेफ रिक्टर (सीएलआर वाया सी # के लेखक) बताते हैं कि इस आलेख में Safe Thread Synchronization पर क्यों है।

विशेष रूप से, उस लेख में "क्यों महान विचार इतना महान नहीं है" आपके प्रश्न का उत्तर देता है।

यह वास्तव में CLR Via C# पुस्तक से एक अध्याय है।

संक्षेप में, "synclock" ऑब्जेक्ट के रूप में एक निजी वस्तु रखने से आपकी कक्षा को आपकी कक्षा की आवश्यकताओं को लॉक करने और नियंत्रित करने की अनुमति मिलती है। इसलिए इस पर ध्यान दिए बिना कि कितने ग्राहक आपकी कक्षा का उपयोग करते हैं, लॉकिंग लगातार और सही तरीके से किया जाता है।

+0

+1। मैं अपनी पुस्तक को इंगित करने जा रहा था, लेकिन यह लेख प्रभावी रूप से वही है! – RichardOD

+0

यदि किसी ऑब्जेक्ट को कुछ परिचालनों के दौरान लॉक करने की आवश्यकता होती है, और यदि बाहरी कोड को उनके बीच लॉक जारी किए बिना दो या दो से अधिक संचालन करने की आवश्यकता हो सकती है, तो ऑब्जेक्ट को लॉक या विधियों को प्राप्त करने और इसे रिलीज़ करने के तरीकों का खुलासा करना चाहिए। न तो एक्सपोज़ करना बाहरी कोड के लिए इसे असंभव बना देगा जो इसे करने की ज़रूरत है। – supercat

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^