Wednesday 15 January 2014

java - Does synchronized park a concurrent thread like Lock.lock() does? -


जब हम lock.lock () कॉल करते हैं या सिंक्रनाइज़ < / कोड> हमारे थ्रेड ब्लॉकों को ब्लॉक करें अगर कोई अन्य धागा पहले से उस लॉक को ले लिया है अब मेरा प्रश्न है, जब हम lock.lock () के कार्यान्वयन पर विचार करते हैं, तब यह प्रतिनिधि AQS को लॉक प्राप्त करता है जो वास्तव में वर्तमान थ्रेड को पार्क करता है (ताकि इसे शेड्यूलर द्वारा निर्धारित नहीं किया जा सकता है)।

क्या यह सिंक्रनाइज़ अवरुद्ध भी है?

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

मेरी चिंता थ्रेड.स्टेटस के पहलुओं में दो लॉकिंग रणनीतियों और व्यस्त इंतजार के बजाय पार्किंग द्वारा प्रदर्शन में सुधार के बीच अंतर है

  1. ReentrantLock.lock ();
  2. सिंक्रनाइज़ {/ * कुछ कोड * /}

    ब्लॉकिंग - एक संसाधन पर अवरुद्ध है, बाधित नहीं किया जा सकता है

    इंतजार - एक संसाधन पर अवरुद्ध है, लेकिन बाधित या अधिसूचित या अप्रकाशित किया जा सकता है।

    जैसा कि आप देख सकते हैं कि WAITING दूसरे प्रसंस्कृत से नियंत्रण के लिए बेहतर है। जैसे यदि दो थ्रेड डेडलॉक हो गए हैं तो आप एक अवरोध () को तोड़ सकते हैं सिंक्रनाइज़ किए गए एक दो धागे के साथ आप फंस गए हैं।

    सिंक्रनाइज़ किए गए बनाम लॉक का व्यवहार बहुत ही समान है और सटीक विवरण बड़े संशोधन के बीच बदल जाता है।

    मेरी सलाह का उपयोग करना है P>

    • सरल कोड के लिए सिंक्रनाइज़ जहां आपको थ्रेड सुरक्षा की आवश्यकता है लेकिन बहुत कम ताला विवाद है।

    • लॉक का उपयोग करें जहां आपने पहचान लिया है कि आपके पास है विवाद को रोकें, या आपको tryLock जैसी अतिरिक्त कार्यक्षमता की आवश्यकता है


      यदि आप करते हैं

        अंतिम लॉक लॉक = नया रीट्रेंट लॉक (); lock.lock (); थ्रेड टी = नया थ्रेड (नया रननाबल ()) {@Override सार्वजनिक शून्य चला () {try.lockInterruptibly ();} पकड़ (बाधित ईक्सेप्शन ई) {e.printStackTrace ();}}}); t.start (); Thread.Sleep (100); System.out.println (टी + "है" + टी.गेटस्टेट ()); लॉक करो लॉक खोलो();   

      प्रिंट

        थ्रेड [थ्रेड -0,5, मुख्य] ​​इंतजार कर रहा है   

      राज्य


      प्रतीक्षा थ्रेड के लिए थ्रेड स्थिति निम्न विधियों में से किसी एक को कॉल करने के कारण एक थ्रेड प्रतीक्षा स्थिति में है:

      • ऑब्जेक्ट। कोई समयबाह्य नहीं है
      • थ्रेड .जोइंड टाइमआउट के साथ < Li> LockSupport.park

        प्रतीक्षा स्थिति में एक धागा एक विशेष कार्रवाई करने के लिए दूसरे थ्रेड के लिए इंतजार कर रहा है। उदाहरण के लिए, किसी ऑब्जेक्ट पर ऑब्जेक्ट.वेट () को एक थ्रेड जो ऑब्जेक्ट पर ऑब्जेक्ट.नोटिफ़ाइज़ () या ऑब्जेक्ट.नोटिफ़ाइफ () को कॉल करने के लिए दूसरे थ्रेड के लिए प्रतीक्षा कर रहा है। धागे जो Thread.join () नामक एक निर्दिष्ट थ्रेड को समाप्त करने के लिए प्रतीक्षा कर रहा है।

No comments:

Post a Comment