2011-09-16 9 views
5

संभव डुप्लिकेट:
What is the Re-entrant lock and concept in general?जावा में लॉक पुनर्वित्त क्या है?

मैं जावा में रैत्रांत ताले समझने की कोशिश कर रहा हूँ और मैं इसे आसानी से समझा रहा हूँ। लॉक पुनर्वित्त क्यों जरूरी है? यह किस समस्या को हल करता है? एक उदाहरण परिदृश्य मदद करेगा।

+0

काफी डुप्लिकेट नहीं है। यह प्रश्न बहुत विशिष्ट है और कुछ विशिष्ट जावा लॉक कार्यान्वयन से संबंधित है। दूसरा सवाल बहुत सामान्य है। – Eddie

उत्तर

3

एक पुनर्वित्त लॉक एक है जो एक ही थ्रेड एक से अधिक बार प्राप्त कर सकता है। आम तौर पर, एक पुनर्विक्रेता लॉक को लॉक होने की संख्या को अनलॉक किया जाना चाहिए। एक पुनर्विक्रेता ताला अक्सर कोड के साथ बहुत आसान है। यदि आपके पास कई विधियां हैं जहां ए कॉल बी और बी कॉल करता है ... लेकिन इस कोड का क्लाइंट ए या बी या सी में कॉल कर सकता है, और यदि आप इन तरीकों में से प्रत्येक में लॉक करना चाहते हैं, तो एक पुनर्विक्रय लॉक आपके हल करेगा मुसीबत। यह इस कोड तक पहुंचने के एक समय में किसी भी थ्रेड को रोक देगा, लेकिन यह एकाधिक लॉक अधिग्रहण की अनुमति देगा ताकि आप स्वयं को डेडलॉक नहीं कर सकें।

मान लें कि आपके पास इस:

public class SyncTest { 
    private final Lock lock = new ReentrantLock(); 
    public void doA() { 
    lock.lock(); 
    try { 
     doB(); 
     doSomethingForA(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doB() { 
    lock.lock(); 
    try { 
     doC(); 
     doSomethingForB(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doC() { 
    lock.lock(); 
    try { 
     doSomeWorkThatEveryoneDoes(); 
    } finally { 
     lock.unlock(); 
    } 
    } 
} 

जहां अन्य कोड उनमें से doA या doB या doC की किसी भी और सभी कॉल कर सकते हैं कुछ ही लॉक का उपयोग कर काम के आसपास सिंक्रनाइज़। इस्तेमाल किया गया ताला "पुनर्वित्त" है जिसमें एक ही धागा इसे कई बार प्राप्त कर सकता है। यदि लॉक पुनर्वित्त नहीं था, तो जब आप doA पर कॉल करते हैं, तो आप doB दर्ज करते हैं और लॉक प्राप्त करने का प्रयास करते हैं, तो आप लॉक हो जाएंगे क्योंकि लॉक पहले से ही स्वामित्व में है, भले ही यह आपके स्वामित्व में हो।

एक शुद्ध गिनती सेमफोर एक की गणना के लिए शुरू किया गया, उदाहरण के लिए, एक गैर-पुनर्विक्रय लॉक है। यदि एक ही धागा इसे दो बार हासिल करने का प्रयास करता है, तो यह हमेशा के लिए एक प्रकार के आत्म-डेडलॉक में अवरुद्ध होगा।

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