2012-06-03 8 views
12

कोशिश वहाँ के बीच कोई अंतर है:lock.lock() से पहले

private Lock lock = new ReentrantLock(true); 

public void getIn (int direction) throws InterruptedException { 

    lock.lock(); 
    try { 
     ... 

और

... 

public void getIn (int direction) throws InterruptedException { 

     try { 
      lock.lock(); 
      ... 

संकलन सुचारू रूप से और भी कार्यक्रम काम करता है (मैं एक ही उत्पादन मतलब)

चला जाता है क्या मुझे लॉक रखना चाहिए। लॉक(); पहले या बाद में कोशिश ...

किसी भी मदद

+1

कौन सी कक्षा 'लॉक' है? – Thor

+1

पकड़ा गया क्या है? यदि आप बाद में 'अपवाद थैट लॉक कैनोट थ्रो' पकड़ते हैं - उनके बीच वास्तव में कोई अंतर नहीं है – amit

+0

कुछ राज्य पहले: निजी लॉक लॉक; और फिर लॉक = नया ReentrantLock (सच); धन्यवाद ... अनलॉकिंग ऑपरेशन अंत में किया जाता है; अंत में} lock.unlock(); – 9628001

उत्तर

0

पहले मामले में के लिए धन्यवाद: अगर lock.lock() फेंकता InterruptedException, getIn यह प्रबंधन करेगा। लेकिन किसी भी अन्य अपवाद के लिए, यह एक अपवाद फेंक जो getIn हैंडल नहीं करता है: रनटाइम अपवाद

दूसरे मामले में: अलग InterruptedException से, try-catch ब्लॉक भी कुछ अपवाद हैंडलिंग, जिसे आप यहां नहीं दिखाया कर रही है। इससे कम अपवाद फेंकना चाहिए, क्योंकि आंतरिक ब्लॉक कुछ अपवादों को भी कैप्चर कर रहा है।

समग्र रनिंग lock.lock() फेंकने वाले अपवादों पर निर्भर करता है?

+0

विधि ['लॉक()'] (http://download.java.net/jdk8/docs/api/java/util/concurrent/locks/ReentrantLock.html#lock--) InterruptedExceptions को फेंक नहीं देता है।'GetIn' विधि में ब्लॉक वास्तव में 'कोशिश-अंत' ब्लॉक है, न कि 'try-catch''। –

9

मानते हुए lock एक ReentrantLock, तब यह, कोई वास्तविक अंतर बना देता है के बाद से lock() कोई अपवाद जाँच फेंक नहीं है है।

जावा दस्तावेज़, उदाहरण में try ब्लॉक के बाहर lock() छोड़ देता है। इसका कारण यह है कि lock() में अपवाद unlock() को गलत तरीके से बुलाया नहीं जाना चाहिए। क्या सभी चीजों के lock() में अनचेक अपवाद की उपस्थिति में शुद्धता चिंता का विषय है, यह एक और चर्चा पूरी तरह से है।

यह सामान्य रूप से try ब्लॉक जैसी चीजों को रखने के लिए सामान्य रूप से एक अच्छा कोडिंग अभ्यास है।

4

कोशिश बयान भी शामिल हैं:

} finally { 
    lock.unlock(); 
} 

यही है, अगर आप try के बाद lock.lock() जगह, lock.lock() द्वारा फेंका अपवाद lock.unlock() है, जो गलत है कारण होगा, क्योंकि ताला प्राप्त नहीं किया गया था, और भी अनलॉक करने का कारण होता है एक और अपवाद तो पहला संस्करण सही है। lock.lock() द्वारा फेंकने वाले अपवादों को संभालने के लिए आपको एक और प्रयास कथन का उपयोग करना होगा।

9

यदि नंबर 1, finally में आप केवल unlock() कह सकते हैं। यदि नंबर 2 में आपको यह जांचने की आवश्यकता है कि क्या आप unlock() से पहले लॉक धारण कर रहे हैं, अन्यथा आप IllegalMonitorStateException

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