2012-07-03 9 views
9

क्या आप मुझे बता सकते हैं कि मुझे स्थिति पर इंतजार करने से पहले लॉक जारी करना चाहिए?हालत - प्रतीक्षा से पहले अनलॉक करना चाहिए?

try { 
    lock.lock(); 
    while (isNotEmpty()) { 
     condition.await(); 
    } 
} finally { 
    lock.unlock(); 
} 

या

try { 
    lock.lock(); 
    while (isNotEmpty()) { 
     lock.unlock(); 
     condition.await(); 
    } 
} finally { 
    lock.unlock(); 
} 
+1

आप पढ़ा है [जावाडोक] (http://docs.oracle.com/javase/7/docs चाहिए अगर आप ऐसा करेंगे /api/java/util/concurrent/locks/Condition.html)? – assylias

+1

'अधिग्रहण(); कोशिश करें {उपयोग(); } अंत में {रिलीज(); } '। यदि आपका अधिग्रहण ('लॉक') विफल रहता है तो आप उस संसाधन को छोड़ देंगे जो आपने कभी नहीं किया था। इस मामले में, आप [पुनर्वित्त] लॉक के एक संलग्न लॉक को अनलॉक कर सकते हैं। –

उत्तर

25

नहीं, आप स्पष्ट रूप से बुला await, await यह स्वचालित रूप से जारी करेंगे पहले अवरोध खोलने की जरूरत नहीं है। javadoc से:

इस स्थिति के साथ जुड़े ताला atomically जारी की है और वर्तमान धागा धागा शेड्यूलिंग प्रयोजनों के लिए विकलांग हो जाता है [...]

और:

वर्तमान इस विधि को कॉल करते समय थ्रेड को Condition से जुड़े लॉक को पकड़ने के लिए माना जाता है।

4

आप केवल await() एक Condition जब आप लॉक है (पर) जुड़े एड कर सकते हैं Lock

क्यों isEmpty अपनी शर्तों बनाने के लिए के लिए कोई शर्त नहीं है साफ।

जावाडोक में उदाहरण देखें। http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

उदा।

lock.lock(); 
try { 
    while (count > 0) 
    isEmpty.await(); 
    // do something when empty. 
} finally { 
    lock.unlock(); 
} 
+2

* "आप लॉक पर इंतजार नहीं कर सकते हैं, आपने लॉक नहीं किया है।" * संभावित रूप से 'लॉक'' स्थिति 'से जुड़ा लॉक है। –

+0

@ टुडर उम्मीद है कि अब यह स्पष्ट है। –

0

इंतजार और सूचित सिंक्रनाइज़ ब्लॉक में साथ से बुलाया जाना चाहिए, ताकि यही नियम का इंतजार है और संकेत के लिए लागू होता है। हालांकि विज्ञप्ति स्वचालित रूप से इंतजार है, लेकिन यह लॉक (बीच) हो सकता है और अनलॉक()

lock.lock()   // start of synchronized block 

condition.await() 

lock.unlock()  // end of synchronized block 
संबंधित मुद्दे