2010-01-07 13 views
55

क्या सिंक्रनाइज़ किए गए खंड में अपवाद फेंकने के लिए कोई अस्पष्ट साइड इफेक्ट्स हैं? लॉक के साथ क्या होता है?सिंक्रनाइज़ किए गए खंड के अंदर अपवाद फेंकने के साइड इफेक्ट्स?

private void doSomething() throws Exception {...} 

synchronized (lock) { 
    doSomething();  
} 

उत्तर

79

मुझे कोई दुष्प्रभाव नहीं दिखता है।

लॉक सभी मामलों में समाप्त होने की गारंटी है, और अपवाद कोई अपवाद नहीं है (पन इरादा)।

+10

+ 1 सबूत देने के लिए, कभी-कभी अपवाद अपवाद नहीं है :-)) –

+0

@KLE त्रुटि के बारे में क्या? अगर कोड स्टैक ओवरफ्लो या आउटऑफमेमरी फेंकता है तो क्या होता है? – Pacerier

+0

[यह पृष्ठ] (http://www.jguru.com/faq/view.jsp?EID=245377) एक एफआईआई देखने के लायक है। –

36

जैसा कि आप उम्मीद करेंगे, लॉक सामान्य रूप से जारी किया जाता है।

संदर्भ के लिए, जो इस व्यवहार की गारंटी देता है JLS के उपयुक्त अनुभाग § 14.19 है:

ब्लॉक के निष्पादन सामान्य रूप से पूरा करता है, तो लॉक अनलॉक हो और सिंक्रनाइज़ बयान सामान्य रूप से पूरा करती है। यदि किसी भी कारण से ब्लॉक का निष्पादन अचानक समाप्त हो जाता है, तो लॉक अनलॉक हो जाता है और सिंक्रनाइज़ कथन उसी कारण से अचानक समाप्त हो जाता है।

('अचानक पूरा होने' कहीं JLS में परिभाषित किया गया है JVM से अपवाद हैं, throw द्वारा उठाए गए अपवाद हैं, और break, continue, या return बयान के उपयोग ब्लॉक के बाहर स्थानांतरण करने के लिए शामिल करने के लिए।)

+0

यदि 'doSomething(); 'java.lang फेंकता है। स्टैक ओवरफ्लो त्रुटि क्या होता है? – Pacerier