नहीं, जब तक आप एक ही वस्तु पर ताला नहीं लगा रहे हैं। पुनरावर्ती कोड प्रभावी रूप से पहले से ही लॉक है और इसलिए अनछुए जारी रख सकते हैं।
lock(object) {...}
मॉनिटर क्लास का उपयोग करने के लिए आशुलिपि है । जैसा कि मार्क बताते हैं , पुन: प्रवेश कीMonitor
अनुमति देता है , इसलिए उस वस्तु पर ताला लगाने का बार-बार प्रयास किया जाता है , जिस पर वर्तमान धागे में पहले से ही ताला लगा हुआ है, यह बहुत ही अच्छा काम करेगा।
यदि आप विभिन्न वस्तुओं पर ताला लगाना शुरू करते हैं, तो आपको सावधान रहना होगा। विशेष ध्यान दें:
- हमेशा एक ही क्रम में वस्तुओं की संख्या पर ताले प्राप्त करें।
- हमेशा आप कैसे उन्हें हासिल करने के लिए रिवर्स अनुक्रम में ताले जारी करते हैं।
यदि आप इनमें से किसी भी नियम को तोड़ते हैं, तो आपको कुछ बिंदुओं पर गतिरोध के मुद्दों की गारंटी दी जाती है ।
यहाँ .NET में थ्रेड सिंक्रोनाइज़ेशन का वर्णन करने वाला एक अच्छा वेबपेज है: http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/
इसके अलावा, संभव के रूप में एक समय में कुछ वस्तुओं पर ताला। जहाँ संभव हो मोटे-मोटे ताले लगाने पर विचार करें । यह विचार यह है कि यदि आप अपना कोड ऐसा लिख सकते हैं कि कोई वस्तु ग्राफ़ है और आप उस ऑब्जेक्ट ग्राफ़ के मूल पर ताले प्राप्त कर सकते हैं, तो ऐसा करें। इसका मतलब है कि आपके पास उस रूट ऑब्जेक्ट पर एक लॉक है और इसलिए आपको उस अनुक्रम के बारे में बहुत चिंता करने की ज़रूरत नहीं है जिसमें आप लॉक प्राप्त / रिलीज करते हैं।
(एक और ध्यान दें, आपका उदाहरण तकनीकी रूप से पुनरावर्ती नहीं है। इसे पुनरावर्ती Bar()
होने के लिए, आमतौर पर पुनरावृत्ति के भाग के रूप में खुद को कॉल करना होगा।)