एक ReentrantLock है असंरचित , के विपरीत synchronized
निर्माणों - यानी आप और लॉक करने के लिए एक ब्लॉक संरचना का उपयोग करने की जरूरत नहीं है यहां तक कि तरीकों भर में एक ताला पकड़ कर सकते हैं। एक उदाहरण:
private ReentrantLock lock;
public void foo() {
...
lock.lock();
...
}
public void bar() {
...
lock.unlock();
...
}
एक synchronized
निर्माण में एकल मॉनिटर के माध्यम से इस तरह के प्रवाह का प्रतिनिधित्व करना असंभव है ।
कि के अलावा, ReentrantLock
समर्थन ताला मतदान और व्यवधान कारक ताला प्रतीक्षा करता है कि समर्थन टाइम-आउट । विन्यास योग्य निष्पक्षता नीति केReentrantLock
लिए भी समर्थन है , जिससे अधिक लचीली थ्रेड शेड्यूलिंग की अनुमति मिलती है।
इस वर्ग के लिए निर्माता एक वैकल्पिक निष्पक्षता पैरामीटर को स्वीकार करता है । जब सेट किया जाता है true
, तो विवाद के तहत, सबसे लंबे समय तक प्रतीक्षा करने वाले धागे तक पहुंच प्रदान करने के पक्ष में है। अन्यथा यह लॉक किसी विशेष एक्सेस ऑर्डर की गारंटी नहीं देता है। कई थ्रेड्स द्वारा एक्सेस किए गए फेयर लॉक्स का उपयोग करने वाले प्रोग्राम डिफॉल्ट सेटिंग का उपयोग करने वालों की तुलना में कम समग्र थ्रूपुट (यानी, धीमे; अक्सर बहुत धीमे) प्रदर्शित कर सकते हैं, लेकिन लॉक प्राप्त करने और भुखमरी की कमी की गारंटी देने के लिए समय में छोटे संस्करण होते हैं। हालांकि, ध्यान दें कि तालों की निष्पक्षता धागा निर्धारण की निष्पक्षता की गारंटी नहीं देती है। इस प्रकार, निष्पक्ष लॉक का उपयोग करने वाले कई थ्रेड्स में से एक इसे उत्तराधिकार में कई बार प्राप्त कर सकता है जबकि अन्य सक्रिय थ्रेड्स प्रगति नहीं कर रहे हैं और वर्तमान में लॉक को पकड़ नहीं रहे हैं। यह भी ध्यान दें कि अप्रयुक्तtryLock
विधि निष्पक्षता सेटिंग का सम्मान नहीं करती है। यह सफल होगा यदि ताला उपलब्ध है, भले ही अन्य धागे प्रतीक्षा कर रहे हों।
ReentrantLock
हो सकता है यह भी हो सकता है और अधिक विश्वसनीय , उच्च विवाद के तहत काफी बेहतर प्रदर्शन करते हुए। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं ।
हालाँकि, यह दावा किया गया है; निम्नलिखित टिप्पणी देखें:
रेंटेंट लॉक टेस्ट में, हर बार एक नया लॉक बनाया जाता है, इस प्रकार कोई विशेष लॉकिंग नहीं होती है और परिणामी डेटा अमान्य होता है। इसके अलावा, आईबीएम लिंक अंतर्निहित बेंचमार्क के लिए कोई स्रोत कोड प्रदान नहीं करता है ताकि इसकी जांच करना असंभव हो कि क्या परीक्षण भी सही तरीके से आयोजित किया गया था।
आपको कब उपयोग करना चाहिए ReentrantLock
? उस developerWorks लेख के अनुसार ...
इसका उत्तर बहुत सरल है - इसका उपयोग तब करें जब आपको वास्तव में किसी ऐसी चीज की आवश्यकता हो जो इसे प्रदान synchronized
नहीं करती है, जैसे कि समयबद्ध लॉक प्रतीक्षा, इंटरप्टिबल लॉक इंतजार, गैर-ब्लॉक-संरचित ताले, कई स्थिति चर या लॉक मतदान। ReentrantLock
स्केलेबिलिटी के लाभ भी हैं, और आपको इसका उपयोग करना चाहिए यदि आपके पास वास्तव में ऐसी स्थिति है जो उच्च विवाद को प्रदर्शित करती है, लेकिन याद रखें कि विशाल बहुमत वाले synchronized
ब्लॉक शायद ही कभी किसी भी विवाद का प्रदर्शन करते हैं, अकेले उच्च विवाद होने दें। मैं तब तक सिंक्रोनाइज़ेशन के साथ विकास करने की सलाह दूंगा जब तक कि सिंक्रोनाइज़ेशन नाकाफी साबित न हो जाए, बजाय यह मानने के कि "यदि आप उपयोग करते हैं तो प्रदर्शन बेहतर होगा"ReentrantLock
। याद रखें, ये उन्नत उपयोगकर्ताओं के लिए उन्नत उपकरण हैं। (और वास्तव में उन्नत उपयोगकर्ता सरल टूल को पसंद करते हैं, जो वे पा सकते हैं जब तक कि वे सरल उपकरण आश्वस्त नहीं होते हैं।) हमेशा की तरह, इसे पहले ठीक करें, और फिर इस बारे में चिंता करें कि आपको इसे तेजी से बनाना है या नहीं।