मैं सोच रहा हूं कि इनमें से कौन सा अभ्यास में बेहतर है और क्यों?
मैंने पाया है कि Lock
और Condition
(और अन्य नई concurrent
कक्षाएं) टूलबॉक्स के लिए सिर्फ अधिक उपकरण हैं। मैं अपने पुराने पंजे के हथौड़े ( synchronized
कीवर्ड) के साथ अपनी जरूरत की अधिकांश चीजें कर सकता था, लेकिन कुछ स्थितियों में इसका इस्तेमाल करना अजीब था। रबर टूललेट, बॉल-पीन हैमर, प्राइबर, और कुछ नेल पंच: एक बार मैंने अपने टूलबॉक्स में और उपकरण जोड़ दिए तो उनमें से कई अजीब हालात बहुत सरल हो गए। हालांकि , मेरे पुराने पंजे का हथौड़ा अभी भी इसके उपयोग के हिस्से को देखता है।
मुझे नहीं लगता कि एक दूसरे की तुलना में वास्तव में "बेहतर" है, बल्कि प्रत्येक अलग-अलग समस्याओं के लिए बेहतर फिट है। संक्षेप में, सरल मॉडल और गुंजाइश-उन्मुख प्रकृति synchronized
मेरे कोड में कीड़े से बचाने में मदद करती है, लेकिन वही फायदे कभी-कभी अधिक जटिल परिदृश्यों में बाधा बनते हैं। इसका ये अधिक जटिल परिदृश्य है कि समवर्ती पैकेज पते की सहायता के लिए बनाया गया था। लेकिन इस उच्च स्तर के निर्माण का उपयोग करने के लिए कोड में अधिक स्पष्ट और सावधानीपूर्वक प्रबंधन की आवश्यकता होती है।
===
मुझे लगता है कि JavaDoc के बीच अंतर Lock
और synchronized
(जोर मेरा है) का वर्णन करने का एक अच्छा काम करता है :
ताला लागू करने से अधिक व्यापक लॉकिंग ऑपरेशन प्रदान किए जाते हैं जो सिंक्रनाइज़ किए गए तरीकों और बयानों का उपयोग करके प्राप्त किया जा सकता है। वे अधिक लचीली संरचना की अनुमति देते हैं , इसमें काफी भिन्न गुण हो सकते हैं, और कई संबद्ध स्थिति वस्तुओं का समर्थन कर सकते हैं ।
...
के उपयोग सिंक्रनाइज़ तरीकों या बयान हर वस्तु के साथ जुड़े निहित मॉनिटर ताला तक पहुँच प्रदान करता है, लेकिन बलों सभी ताला अधिग्रहण और रिहाई एक ब्लॉक-संरचना रास्ते में होने के लिये : जब कई ताले रहे हैं हासिल कर ली है कि वे विपरीत क्रम में जारी किया जाना चाहिए , और सभी तालों को उसी शाब्दिक दायरे में छोड़ा जाना चाहिए, जिसमें वे अधिग्रहित किए गए थे ।
जबकि सिंक्रनाइज़ किए गए तरीकों और बयानों के लिए स्कोपिंग तंत्र मॉनिटर लॉक के साथ प्रोग्राम करना बहुत आसान बनाता है , और ताले से जुड़े कई सामान्य प्रोग्रामिंग त्रुटियों से बचने में मदद करता है , ऐसे मौके हैं जहां आपको अधिक लचीले तरीके से ताले के साथ काम करने की आवश्यकता होती है। उदाहरण के लिए, समवर्ती रूप से एक्सेस किए गए डेटा स्ट्रक्चर्स को ट्रैवर्स करने के लिए * * कुछ एल्गोरिदम * को "हैंड-ओवर-हैंड" या "चेन लॉकिंग" के उपयोग की आवश्यकता होती है : आप नोड ए का लॉक हासिल करते हैं, फिर नोड बी, फिर ए जारी करते हैं और सी का अधिग्रहण करते हैं, तब बी रिलीज करें और डी और इतने पर अधिग्रहण करें। लॉक इंटरफ़ेस के कार्यान्वयन लॉक को अलग-अलग स्कोप में अधिग्रहित और जारी करने की अनुमति देकर ऐसी तकनीकों के उपयोग को सक्षम करते हैं , औरकिसी भी क्रम में कई तालों को अधिग्रहित और जारी करने की अनुमति देना ।
इस बढ़े हुए लचीलेपन के साथ अतिरिक्त जिम्मेदारी आती है । ब्लॉक-स्ट्रक्चर्ड लॉकिंग की अनुपस्थिति सिंक्रनाइज़ विधियों और स्टेटमेंट्स के साथ होने वाले लॉक की स्वचालित रिलीज़ को हटा देती है । ज्यादातर मामलों में, निम्नलिखित मुहावरे का उपयोग किया जाना चाहिए:
...
जब अलग-अलग स्कोप में लॉकिंग और अनलॉकिंग होती है , तो यह सुनिश्चित करने के लिए ध्यान रखा जाना चाहिए कि लॉक होते समय निष्पादित सभी कोड को ट्राइ-एंड या ट्राइ-कैच द्वारा संरक्षित किया जाता है ताकि यह सुनिश्चित हो सके कि लॉक को आवश्यक होने पर जारी किया गया है।
लॉक कार्यान्वयन प्रदान अतिरिक्त कार्यक्षमता एक प्रदान करके सिंक्रनाइज़ तरीकों और बयानों के उपयोग पर गैर अवरुद्ध प्राप्त करने के लिए प्रयास एक ताला (tryLock ()), के लिए एक प्रयास ताला कि बाधित किया जा सकता प्राप्त करने की कोशिश (lockInterruptibly (), और अधिग्रहण लॉकआउट जो टाइमआउट कर सकता है (tryLock (long, TimeUnit))।
...