एक पुनर्वित्त लॉक एक है जो एक ही थ्रेड एक से अधिक बार प्राप्त कर सकता है। आम तौर पर, एक पुनर्विक्रेता लॉक को लॉक होने की संख्या को अनलॉक किया जाना चाहिए। एक पुनर्विक्रेता ताला अक्सर कोड के साथ बहुत आसान है। यदि आपके पास कई विधियां हैं जहां ए कॉल बी और बी कॉल करता है ... लेकिन इस कोड का क्लाइंट ए या बी या सी में कॉल कर सकता है, और यदि आप इन तरीकों में से प्रत्येक में लॉक करना चाहते हैं, तो एक पुनर्विक्रय लॉक आपके हल करेगा मुसीबत। यह इस कोड तक पहुंचने के एक समय में किसी भी थ्रेड को रोक देगा, लेकिन यह एकाधिक लॉक अधिग्रहण की अनुमति देगा ताकि आप स्वयं को डेडलॉक नहीं कर सकें।
मान लें कि आपके पास इस:
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
दर्ज करते हैं और लॉक प्राप्त करने का प्रयास करते हैं, तो आप लॉक हो जाएंगे क्योंकि लॉक पहले से ही स्वामित्व में है, भले ही यह आपके स्वामित्व में हो।
एक शुद्ध गिनती सेमफोर एक की गणना के लिए शुरू किया गया, उदाहरण के लिए, एक गैर-पुनर्विक्रय लॉक है। यदि एक ही धागा इसे दो बार हासिल करने का प्रयास करता है, तो यह हमेशा के लिए एक प्रकार के आत्म-डेडलॉक में अवरुद्ध होगा।
काफी डुप्लिकेट नहीं है। यह प्रश्न बहुत विशिष्ट है और कुछ विशिष्ट जावा लॉक कार्यान्वयन से संबंधित है। दूसरा सवाल बहुत सामान्य है। – Eddie