2011-02-18 16 views
12

लॉग विधि ब्लॉक नहीं होना चाहिए?यह कोड कैसे डेडलॉक नहीं करता है?

namespace Sandbox { 
class Program { 
    static void Main(string[] args) { 
     var log = new Logger(); 
     lock (log) { 
      log.Log("Hello World!"); 
     } 
    } 
} 

public class Logger { 
    public void Log(string message) { 
     lock (this) { 
      Console.WriteLine(message); 
     } 
    } 
} 

}

+2

संभावित डुप्लिकेट [लॉक एक्क्यूवर्ड और लॉक करने के लिए और प्रयासों को लॉक न करें: क्या सी # लॉक फिर से प्रवेश कर रहे हैं?] (Http://stackoverflow.com/questions/4846010/lock-aqcuired-and-further-attempts-to -lock-do-not-block-are-c-locks-re-entrant) –

उत्तर

37

एक ही धागे एक ही ताला दो बार प्राप्त है। यह काम करता है क्योंकि .NET तथाकथित रिकर्सिव लॉक का समर्थन करता है (उर्फ reentrant mutexes)।

+0

धन्यवाद कॉनराड! – Marco

+0

क्या हम सी # में रहने वाले इस व्यवहार पर भरोसा कर सकते हैं? यह चीजों को आसान बनाता है, लेकिन चूंकि मैंने इसे एमएसडीएन दस्तावेज़ों में उल्लिखित नहीं देखा है, इसलिए मुझे आश्चर्य है कि यह एक कार्यान्वयन दुष्प्रभाव है जो भविष्य में बदल सकता है। –

3

सरल - आप एक ही थ्रेड में चल रहे हैं।

4

यदि कोई संसाधन थ्रेड द्वारा लॉक किया गया है, तो उस धागे की अनुमति है, भले ही उसके पास पहले से लॉक हो। यह

Object obj = new Object(); 

lock(obj) { 
    lock(obj) { 
     foo(); 
    } 
} 

यदि आप एक ही धागे के आधार पर नहीं पहुंच पा रहे हैं तो लॉक हो जाएगा।

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