2013-02-11 53 views
12

निम्नलिखित वर्ग को देखते हुए:एकाधिक लॉक ऑब्जेक्ट्स आवश्यक हैं?

class x 
{ 
    Object lockOne = new Object(); 
    Object lockTwo = new Object(); 

    List<Something> listOne = new List<Something>(); 
    List<Something> listTwo = new List<Something>(); 

    void MethodOne() 
    { 
     lock(lockOne) 
     { 
      // some operation on listOne 
     } 
    } 

    void MethodTwo() 
    { 
     lock(lockTwo) 
     { 
      // some operation on listTwo 
     } 
    } 
} 

यह सही दो ताला लगा यह सोचते हैं कि MethodOne() और MethodTwo() अलग धागे समवर्ती यह देखते हुए कि listOne और listTwo में वैसे भी संबंधित नहीं हैं से कहा जा सकता है वस्तुओं का उपयोग करने के है। ताले में शामिल एकमात्र ऑपरेशन ऊपर दी गई टिप्पणियों में निर्दिष्ट हैं।

+1

यह ताला बंटवारे को फोन किया और एक अच्छा विवाद को कम करने के लिए यदि दो वस्तुओं और तरीके हैं जिस तरह से है: निम्नलिखित कोड कम कोड, कम भूमि के ऊपर और गलती से गलत ताला का उपयोग करने का कम मौका, बस के रूप में अच्छी तरह से काम करेगा स्वतंत्र। – assylias

+0

यह सामान्य ज्ञान कहा जाता है किया जाना चाहिए, यह कर दूसरा रास्ता चारों ओर एक बहुत बुरा व्यवहार है। – Dariusz

+0

एक बात आप में देखने के लिए चाहते हो सकता है एक [ReaderWriterLock] (http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx) का उपयोग किया गया है। आप केवल सूची से पढ़ रहे हैं यह एक से अधिक थ्रेड ('List' सुरक्षित थ्रेड पढ़ता है) एक ही बार में इसका इस्तेमाल करने की अनुमति देता है, एक बार आप आप ताला और फिर सिर्फ एक ही धागे में लिख सकते हैं उन्नयन और सभी पाठकों ब्लॉक किए गए हैं लिखने के लिए की जरूरत है, इसके बाद कई पाठक फिर से शुरू कर सकते हैं। –

उत्तर

7

हाँ, यह सही है। यह सिर्फ एक सूची को लॉक करने से बचाता है क्योंकि दूसरी सूची पर काम किया जा रहा है।

+2

सही? हाँ। बेकार? इसके अलावा, यहां अलग लॉक ऑब्जेक्ट्स की आवश्यकता नहीं है। – svick

+4

स्विस ने जो कहा, उसे स्पष्ट करने के लिए, वह एक लॉक ऑब्जेक्ट को लॉक करने के लिए नहीं कह रहा है लेकिन [किसी भी लॉक ऑब्जेक्ट्स का उपयोग न करने के लिए] (http://stackoverflow.com/a/14814386/80274) और सूची को स्वयं लॉक करें । –

6

अलग लॉक के लिए कोई जरूरत नहीं है यहाँ वस्तुओं।

class x 
{ 
    List<Something> listOne = new List<Something>(); 
    List<Something> listTwo = new List<Something>(); 

    void MethodOne() 
    { 
     lock (listOne) 
     { 
      // some operation on listOne 
     } 
    } 

    void MethodTwo() 
    { 
     lock (listTwo) 
     { 
      // some operation on listTwo 
     } 
    } 
} 
+10

बस एक नोट के रूप में, सर्वोत्तम अभ्यास (इस शो की तरह) केवल उन वस्तुओं को लॉक करना है जो कक्षा में 'निजी' हैं - अन्यथा आप नहीं जानते कि बाहरी कोड उस समय लॉक करने का प्रयास कर सकता है जब डेडलॉक्स या दौड़ की स्थिति । –

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

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