दिलचस्प पोस्ट
माउस को स्थानांतरित करने के बिना ब्राउज़र कर्सर को "प्रतीक्षा" से "स्वतः" तक ले जाना कैसे एक JTextField UnFocus करने के लिए संरचना निर्माता: "कॉलर को नियंत्रण से पहले फ़ील्ड पूरी तरह असाइन किया जाना चाहिए।" पासवर्ड-सुरक्षित वर्ग कैसे लिखना है? क्या सी प्रीप्रोसेसर स्ट्रिप टिप्पणी या पहले मैक्रोज़ का विस्तार करता है? जब सामग्री फोकस / क्लिक करें contentedable div में सभी पाठ का चयन करें थ्रेड नियंत्रण के लिए अस्थिर बूल गलत माना जाता है? लिंक रिएक्शन-राउटर में प्रॉप्स पास करें क्या स्ट्रैक्टस इंटरफेस लागू करने के लिए यह सुरक्षित है? बुनियादी HTML दृश्य प्रस्तुत करना है? Node_modules फ़ोल्डर के अंदर स्थित स्क्रिप्ट को कैसे शामिल करें? एंड्रॉइड पर अपने माता-पिता के लिए onClick ईवेंट कैसे पास करें? क्या "अनाम स्ट्रैक्ट्स" मानक है? और, वास्तव में, वे क्या हैं? पायथन: mysqldb को एक शब्दकोश के रूप में एक MySQL तालिका आयात करने के लिए उपयोग करें? आंशिक स्ट्रिंग पर Javascript getElementById आधार

क्या एक लॉक ऑब्जेक्ट लॉक किया जाता है अगर इसमें कोई अपवाद होता है?

सी # थ्रेडिंग ऐप में, अगर मैं किसी ऑब्जेक्ट को लॉक करना होता, तो हम एक कतार कहें, और यदि कोई अपवाद होता है, तो क्या ऑब्जेक्ट लॉक होगा? ये छद्म कोड है:

int ii; lock(MyQueue) { MyClass LclClass = (MyClass)MyQueue.Dequeue(); try { ii = int.parse(LclClass.SomeString); } catch { MessageBox.Show("Error parsing string"); } } 

जैसा कि मैं समझता हूं, पकड़ के बाद कोड निष्पादित नहीं होता है – लेकिन मैं सोच रहा हूं कि लॉक मुक्त हो जाएगा।

Solutions Collecting From Web of "क्या एक लॉक ऑब्जेक्ट लॉक किया जाता है अगर इसमें कोई अपवाद होता है?"

प्रथम; क्या आपने TryParse माना है?

 in li; if(int.TryParse(LclClass.SomeString, out li)) { // li is now assigned } else { // input string is dodgy } 

ताला 2 कारणों के लिए जारी किया जाएगा; सबसे पहले, lock मूलतः है:

 Monitor.Enter(lockObj); try { // ... } finally { Monitor.Exit(lockObj); } 

दूसरा; आप पकड़ते हैं और आंतरिक अपवाद फिर से नहीं फेंकते हैं, इसलिए lock वास्तव में एक अपवाद नहीं देखता है बेशक, आप एक संदेश बॉक्स की अवधि के लिए ताला लगा रहे हैं, जो कि एक समस्या हो सकती है।

तो यह सबसे अधिक घातक विनाशकारी अप्राप्य अपवादों में जारी किया जाएगा।

मुझे लगता है कि किसी ने इस पुराने प्रश्न के जवाब में इसका उल्लेख नहीं किया है कि एक अपवाद पर लॉक जारी करना एक अविश्वसनीय रूप से खतरनाक बात है। हां, सी # में बकाया बयानों में "आखिरकार" शब्दार्थ हैं; जब नियंत्रण सामान्य रूप से या असामान्य रूप से ताला से बाहर निकलता है, ताला जारी किया जाता है। आप सब इस बारे में बात कर रहे हैं जैसे यह एक अच्छी बात है, लेकिन यह एक बुरी चीज है! सही काम करने के लिए अगर आपके पास लॉक क्षेत्र है जो एक अप्रतिबंधित अपवाद फेंकता है, तो रोगी प्रक्रिया को तत्काल समाप्त करने से पहले इसे और अधिक उपयोगकर्ता डेटा नष्ट कर देता है , ताला रहित नहीं होता और जा रहा है

इसे इस तरह देखें: मान लें कि आपके पास दरवाजे पर लॉक के साथ एक बाथरूम और बाहर की प्रतीक्षा करने वाले लोगों की एक पंक्ति है। बाथरूम में एक बम बाहर निकल जाता है, वहां उस व्यक्ति की हत्या कर रही है आपका सवाल है "उस स्थिति में लॉक स्वचालित रूप से अनलॉक हो जाता है ताकि अगले व्यक्ति बाथरूम में जा सके?" हाँ यह होगा। ये अच्छी बात नहीं है। एक बम वहां गया था और किसी को मार डाला! पाइपलाइन शायद नष्ट हो जाती है, घर अब संरचनात्मक रूप से ध्वनि नहीं है, और वहां एक और बम हो सकता है । सही काम करना जितना जल्दी हो सके सभी को बाहर निकल जाएंगे और पूरे घर को ध्वस्त कर देगा।

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

यदि आप किसी एक थ्रेड को राज्य को एक साथ पढ़ने के लिए एक उत्परिवर्तन करने के लिए कोड का एक क्षेत्र बंद कर देते हैं, और उत्परिवर्तन फेंकता है, तो अगर डेटा पहले भ्रष्ट नहीं हुआ है, तो यह निश्चित है कि अब । जो वास्तव में ताला के खिलाफ की रक्षा के लिए माना जाता है कि परिदृश्य है। अब वह कोड जो उस राज्य को पढ़ने के लिए इंतजार कर रहा है, उसे तुरंत भ्रष्ट स्थिति तक पहुंचाया जाएगा, और शायद खुद ही दुर्घटना फिर, सही काम करने की प्रक्रिया को समाप्त करना है

कोई फर्क नहीं पड़ता कि आप इसे कैसे टुकड़ा करते हैं, ताला के अंदर एक अपवाद बुरी खबर है । पूछने का सही सवाल यह नहीं है कि "क्या अपवाद की स्थिति में मेरा लॉक साफ हो जाएगा?" पूछने का सही सवाल यह है कि "मैं कैसे सुनिश्चित करता हूं कि लॉक के अंदर कोई अपवाद नहीं है? और अगर वहाँ है, तो मैं अपने कार्यक्रम को कैसे संरचित करूँगा ताकि उत्परिवर्तन पिछले अच्छे राज्यों में वापस लाया जा सके?"

हाँ, वह ठीक से रिलीज होगी; lock try / finally रूप में कार्य करता है, finally में Monitor.Exit(myLock) साथ, इससे कोई फर्क नहीं पड़ता कि आप कैसे निकलते हैं, इसे जारी किया जाएगा। एक साइड-नोट के रूप में, catch(... e) {throw e;} सबसे अच्छा बचा जाता है, क्योंकि उस पर स्टैक-ट्रेस को क्षति पहुंचाई जाती है; यह बेहतर नहीं है कि इसे पकड़ना, या वैकल्पिक रूप से: throw; उपयोग करें throw; बजाय throw e; जो फिर से फेंक करता है

यदि आप वास्तव में जानना चाहते हैं, तो C # 4 / .NET 4 में एक लॉक है:

 { bool haveLock = false; try { Monitor.Enter(myLock, ref haveLock); } finally { if(haveLock) Monitor.Exit(myLock); } } 

"एक लॉक स्टेटमेंट मॉनिटर करने के लिए कॉल करने के लिए संकलित किया जाता है। एंटर, और फिर एक प्रयास करें … अंत में ब्लॉक। अंत में ब्लॉक, मॉनिटर।

दोनों x86 और x64 के लिए जेआईटी कोड पीढ़ी यह सुनिश्चित करता है कि किसी मॉरेटर के बीच एक थ्रेड असम्भव नहीं हो सकता.इंटर कॉल और एक कोशिश ब्लॉक जो तुरंत इसका अनुसरण करता है। "

से लिया गया: यह साइट

आपका लॉक ठीक से जारी किया जाएगा। एक lock इस तरह कार्य करता है:

 try { Monitor.Enter(myLock); // ... } finally { Monitor.Exit(myLock); } 

और finally ब्लॉकों को निष्पादित करने की गारंटी दी जाती है, चाहे आप try ब्लॉक को कैसे छोड़ दें।

बस मार्क के उत्कृष्ट उत्तर के लिए थोड़ा जोड़ने के लिए।

इस तरह की स्थिति lock कीवर्ड के अस्तित्व का बहुत ही कारण है। यह डेवलपर्स को सुनिश्चित करता है कि लॉक को finally ब्लॉक में रिलीज़ किया गया है।

यदि आपको Monitor.Enter का उपयोग करने के लिए मजबूर किया जाता है। एक टाइमआउट को समर्थन देने के लिए, उदाहरण के लिए Monitor.Enter / Exit , आपको Monitor.Exit को कॉल करने के लिए सुनिश्चित करना चाहिए। finally ब्लॉक में एक अपवाद के मामले में लॉक के उचित रिलीज सुनिश्चित करने के लिए आवश्यक है।