जब भी जावा तुल्यकालन के बारे में SO पर कोई प्रश्न आता है, तो कुछ लोग यह बताने के लिए बहुत उत्सुक होते हैं कि synchronized(this)
इससे बचना चाहिए। इसके बजाय, वे दावा करते हैं, एक निजी संदर्भ पर ताला पसंद किया जाना है।
दिए गए कारणों में से कुछ हैं:
- कुछ बुराई कोड आपके लॉक को चुरा सकते हैं (यह बहुत लोकप्रिय है, इसका "गलती से" संस्करण भी है)
- एक ही वर्ग के भीतर सभी सिंक्रनाइज़ किए गए तरीके सटीक उसी लॉक का उपयोग करते हैं, जो थ्रूपुट को कम करता है
- आप (अनावश्यक रूप से) बहुत अधिक जानकारी उजागर कर रहे हैं
मेरे सहित अन्य लोगों का तर्क है कि synchronized(this)
एक मुहावरा है जो बहुत अधिक (जावा पुस्तकालयों में भी) उपयोग किया जाता है, सुरक्षित और अच्छी तरह से समझा जाता है। इसे टाला नहीं जाना चाहिए क्योंकि आपके पास बग है और आपके मल्टीथ्रेडेड प्रोग्राम में जो चल रहा है उसका आपको कोई सुराग नहीं है। दूसरे शब्दों में: यदि यह लागू है, तो इसका उपयोग करें।
मैं कुछ वास्तविक दुनिया के उदाहरणों को देखने में दिलचस्पी रखता हूं (कोई फोब्बर सामान नहीं है) जहां पर ताला लगाने से बचना this
बेहतर synchronized(this)
होता है जब वह काम भी करेगा।
इसलिए: क्या आपको हमेशा synchronized(this)
निजी संदर्भ पर ताला लगाने से बचना और बदलना चाहिए?
कुछ और जानकारी (उत्तर के रूप में अपडेट की गई हैं):
- हम उदाहरण सिंक्रनाइज़ेशन के बारे में बात कर रहे हैं
- दोनों निहित (
synchronized
तरीके) और स्पष्ट रूप परsynchronized(this)
विचार किए जाते हैं - यदि आप इस विषय पर बलोच या अन्य अधिकारियों को उद्धृत करते हैं, तो उन हिस्सों को न छोड़ें जिन्हें आप पसंद नहीं करते हैं (जैसे प्रभावी जावा, थ्रेड सुरक्षा पर आइटम: आमतौर पर यह उदाहरण पर ही लॉक होता है, लेकिन अपवाद हैं।)
- यदि आपको
synchronized(this)
प्रदान करने के अलावा अपने लॉकिंग में ग्रैन्युलैरिटी की आवश्यकता है , तोsynchronized(this)
लागू नहीं है , इसलिए यह मुद्दा नहीं है