क्यों इन इतना मौलिक हैं हर वस्तु उन्हें करने के लिए है और यह है कि उनमें (संभवतः कुछ राज्य में उन्हें संग्रहीत किया जाता है) होने में एक प्रदर्शन हिट?
टीएल; डॉ: वे थ्रेड-सुरक्षा विधियां हैं और उनके मूल्य के सापेक्ष छोटी लागतें हैं।
मौलिक वास्तविकताओं these methods समर्थन कर रहे हैं कि है कि:
- जावा हमेशा मल्टी-थ्रेडेड है। उदाहरण: jconsole या jvisualvm का उपयोग करके किसी प्रक्रिया द्वारा प्रयुक्त थ्रेड की सूची देखें।
- सुधार "प्रदर्शन" से अधिक महत्वपूर्ण है। जब मैं परियोजनाओं (कई साल पहले) ग्रेडिंग कर रहा था, तो मुझे समझाना पड़ता था कि "गलत जवाब पर वास्तव में तेजी से अभी भी गलत है।"
मूल रूप से, ये विधियां सिंक्रनाइज़ेशन में उपयोग किए गए प्रति-ऑब्जेक्ट मॉनीटर प्रबंधित करने के लिए कुछ हुक प्रदान करती हैं। विशेष रूप से, यदि मेरे पास synchronized(objectWithMonitor)
किसी विशेष विधि में है, तो मैं उस मॉनीटर को उत्पन्न करने के लिए objectWithMonitor.wait()
का उपयोग कर सकता हूं (उदाहरण के लिए, यदि मुझे आगे बढ़ने से पहले गणना पूर्ण करने के लिए किसी अन्य विधि की आवश्यकता है)। उस स्थिति में, वह उस अन्य विधि को अनुमति देगा जो उस मॉनिटर को आगे बढ़ने के लिए अवरुद्ध कर रहा था।
दूसरी ओर, मैं objectWithMonitor.notifyAll()
का उपयोग कर सकता हूं ताकि मॉनिटर के लिए इंतजार कर रहे थ्रेड को पता चल जाए कि मैं जल्द ही मॉनिटर को छोड़ दूंगा। हालांकि, जब तक मैं सिंक्रनाइज़ किए गए ब्लॉक को छोड़ नहीं देता तब तक वे वास्तव में आगे नहीं बढ़ सकते हैं।
विशिष्ट उदाहरण (जैसे, डबल्स की लंबी सूची) जहां चिंता हो सकता है एक प्रदर्शन या स्मृति निगरानी तंत्र पर चोट नहीं है कि के संबंध में
, यहाँ कुछ अंक है कि आप की संभावना पर विचार करना चाहिए रहे हैं:
- पहले , इसे साबित करो। यदि आपको लगता है कि मूल जावा तंत्र जैसे बहु-थ्रेडेड शुद्धता से कोई बड़ा प्रभाव पड़ता है, तो आपके अंतर्ज्ञान गलत होने का एक शानदार मौका है। पहले प्रभाव को मापें। यदि यह गंभीर है और आप जानते हैं कि आपको कभी भी डबल डबल पर सिंक्रनाइज़ करने की आवश्यकता नहीं होगी, इसके बजाय युगल का उपयोग करने पर विचार करें।
- यदि आप निश्चित नहीं हैं कि आप, आपके सहकर्मी, भावी रखरखाव कोडर (जो स्वयं एक वर्ष बाद हो सकता है) इत्यादि।, कभी भी कभी भी आपके डेटा तक सीमित पहुंच की एक अच्छी ग्रैन्युलरिटी की आवश्यकता नहीं होगी, इन मॉनीटरों को दूर करने का एक शानदार मौका केवल आपके कोड को कम लचीला और बनाए रखने योग्य बनाएगा।
प्रति-वस्तु बनाम स्पष्ट नजर रखने वस्तुओं पर सवाल के जवाब में पालन-अप:
लघु जवाब: @JonSkeet: हाँ, पर नज़र रखता है को हटाने समस्या पैदा होगा: यह बन जाएगा टकराव। Object
में उन मॉनीटर को रखने से हमें याद दिलाता है कि यह हमेशा एक बहुप्रचारित प्रणाली है।
बिल्ट-इन ऑब्जेक्ट मॉनीटर परिष्कृत नहीं हैं लेकिन वे हैं: समझाने में आसान; एक अनुमानित फैशन में काम करते हैं; और उनके उद्देश्य में स्पष्ट हैं। synchronized(this)
इरादे का एक स्पष्ट बयान है। यदि हम नौसिखिया कोडर को विशेष रूप से समवर्ती पैकेज का उपयोग करने के लिए मजबूर करते हैं, तो हम घर्षण पेश करते हैं। उस पैकेज में क्या है? एक सैमफोर क्या है? कांटा-में शामिल होने?
एक नौसिखिया कोडर ऑब्जेक्ट मॉनीटर का उपयोग सभ्य मॉडल-व्यू-कंट्रोलर कोड लिखने के लिए कर सकता है। synchronized
, wait
और notifyAll
का उपयोग निष्पक्ष (सरल, सुलभ लेकिन शायद रक्तस्राव-किनारे प्रदर्शन के भाव में) थ्रेड-सुरक्षा को लागू करने के लिए किया जा सकता है। कैननिकल उदाहरण इन डबल्स में से एक होगा (ओपी द्वारा प्रस्तुत) जिसमें एक थ्रेड एक मूल्य निर्धारित कर सकता है जबकि एडब्ल्यूटी थ्रेड को इसे जेएलएबल पर रखने का मूल्य मिलता है। उस स्थिति में, बाहरी मॉनीटर रखने के लिए एक स्पष्ट अतिरिक्त ऑब्जेक्ट बनाने का कोई अच्छा कारण नहीं है।
जटिलता के थोड़ा उच्च स्तर पर, ये वही विधियां बाह्य निगरानी विधि के रूप में उपयोगी होती हैं। उपर्युक्त उदाहरण में, मैंने स्पष्ट रूप से ऐसा किया (ऊपर ऑब्जेक्ट विथ मॉनिटर टुकड़े देखें)। फिर, ये विधियां अपेक्षाकृत सरल थ्रेड सुरक्षा को एक साथ रखने के लिए वास्तव में आसान हैं।
यदि आप और भी परिष्कृत होना चाहते हैं, तो मुझे लगता है कि आपको Java Concurrency In Practice पढ़ने के बारे में गंभीरता से सोचना चाहिए (यदि आपने पहले से नहीं किया है)। लॉक पढ़ें और लिखना बहुत अधिक जटिलता जोड़ने के बिना बहुत शक्तिशाली हैं।
पंचलाइन: बुनियादी सिंक्रनाइज़ेशन विधियों का उपयोग करके, आप थ्रेड-सुरक्षा के साथ आधुनिक बहु-कोर प्रोसेसर द्वारा सक्षम प्रदर्शन के एक बड़े हिस्से का फायदा उठा सकते हैं और बिना किसी ओवरहेड के।
आपका उदाहरण खराब रूप से चुना गया है, क्योंकि स्ट्रिंग अपरिवर्तनीय है और इस प्रकार स्टेटलेस जो एक सापेक्ष दुर्लभता है। –
@ केविन - धन्यवाद। संपादित करेंगे –