सिंक्रोनाइझ वापरणे - १

"हाय, अमिगो!"

"हो, मी इथे आहे, मी इथे आहे."

"आज, मी तुम्हाला सराव मध्ये सिंक्रोनाइझ वापरण्याबद्दल सांगेन ."

"जेव्हा प्रोग्राममध्ये अनेक ऑब्जेक्ट्स आणि थ्रेड्स असतात, तेव्हा अनेकदा असे घडते की एकाच ऑब्जेक्टसह अनेक थ्रेड्स एकाच वेळी कार्य करतात. असे करताना, थ्रेड्स एकमेकांमध्ये हस्तक्षेप करतात."

"हो, मला हे आधीच माहित आहे."

"म्हणून, समजा तुमच्याकडे एकापेक्षा जास्त थ्रेड्सद्वारे प्रवेश केला जाणारा ऑब्जेक्ट आहे. समस्या टाळण्यासाठी तुम्ही दोन गोष्टी करू शकता."

"प्रथम म्हणजे जेथे ऑब्जेक्टमध्ये प्रवेश केला जातो त्या प्रत्येक स्थानावर गुंडाळण्यासाठी सिंक्रोनाइझ ब्लॉक्सचा वापर करणे. परंतु काही प्रोग्रामरने सिंक्रोनाइझ केलेल्या ब्लॉकशिवाय ऑब्जेक्टमध्ये थेट प्रवेश करणारे कोड लिहिल्यास हा दृष्टीकोन कार्य करणार नाही."

"म्हणून, बहुतेक वेळा दुसरा दृष्टीकोन वापरला जातो - ऑब्जेक्ट थ्रेड-सुरक्षित बनवण्यासाठी." "दुसर्‍या शब्दात, सिंक्रोनाइझ केलेली यंत्रणा ऑब्जेक्टमध्येच तयार केली जाते: ती सिंक्रोनाइझ केलेल्या पद्धती घोषित करते आणि/किंवा सिंक्रोनाइझ केलेल्या ब्लॉक्समध्ये त्याच्या पद्धतींमध्ये कोड गुंडाळते."

"म्हणून मी एकाधिक थ्रेड्समधून वापरू शकतो असे कोणतेही ऑब्जेक्ट, आणि हे प्रोग्राममधील जवळजवळ सर्व ऑब्जेक्ट्स आहेत, मला थ्रेड-सेफ बनवावे लागेल?"

"सर्वसाधारणपणे, होय. प्रत्यक्षात, प्रोग्राममधील सर्व ऑब्जेक्ट्स वेगवेगळ्या थ्रेड्सद्वारे वापरल्या जात नाहीत, परंतु सहसा बरेच असतात. म्हणून, जेव्हा तुम्ही थ्रेडसाठी कोड लिहायला सुरुवात करता आणि त्यातून विविध ऑब्जेक्ट्समध्ये प्रवेश करता तेव्हा प्रत्येक पद्धतीसह कॉल करा. तुम्ही स्वतःला विचारले पाहिजे, "हा कॉल सुरक्षित आहे का?"

"सुरक्षित?"

"थ्रेड-सेफ, याचा अर्थ एकाधिक थ्रेड्सवरून सुरक्षितपणे कॉल केला जाऊ शकतो."

"ही काही उदाहरणे आहेत. समजा तुमच्याकडे एक स्ट्रिंग ऑब्जेक्ट आहे जी वेगवेगळ्या थ्रेड्समधून ऍक्सेस केली जाते. जसे की तुम्ही आधीच लक्षात ठेवले पाहिजे, स्ट्रिंग अपरिवर्तनीय आहे — इतर सर्व आदिम प्रकारांप्रमाणे. याचा अर्थ असा की एखादी वस्तू तयार झाल्यानंतर बदलत नाही. याचा अर्थ असा आहे की अशा वस्तूला "तोडणे" अशक्य आहे. सर्व अपरिवर्तनीय वस्तू थ्रेड-सेफ आहेत."

"बरं, ते गोष्टी सुलभ करते."

"आता, समजा तुम्हाला बदलता येण्याजोग्या स्ट्रिंगची गरज आहे."

"हो, मला आठवते. अशा स्ट्रिंगचे दोन प्रकार आहेत: StringBuffer आणि StringBuilder. StringBuffer हे StringBuilder सारखे आहे, परंतु त्याच्या सर्व पद्धती समक्रमित आहेत. ते थ्रेड-सेफ देखील आहे का?"

"होय. जर तुम्हाला एकाधिक थ्रेड्समधून स्ट्रिंगबिल्डर ऑब्जेक्ट ऍक्सेस करण्याची आवश्यकता असेल, तर तुम्ही ते स्ट्रिंगबफरने बदलले पाहिजे. अन्यथा, लवकरच किंवा नंतर थ्रेड्स त्याच वेळी ते बदलतील आणि तो "ब्रेक" करतील."

"वेगवेगळ्या थ्रेड्सवरून ऍक्सेस केलेला ऑब्जेक्ट माझ्या स्वतःच्या वर्गाचा ऑब्जेक्ट असेल तर काय? मला या प्रकरणात देखील त्याच्या पद्धतींमध्ये समक्रमित जोडण्याची आवश्यकता आहे का?"

"होय. हा नियम पाळणे उत्तम आहे: वेगवेगळ्या थ्रेड्समधून प्रवेश करणार्‍या सर्व ऑब्जेक्ट्स थ्रेड-सेफ असणे आवश्यक आहे."

"मी पाहतो. मला वाटले नाही की सर्वकाही इतके गंभीर आहे. धन्यवाद, एली."

"तुमचे स्वागत आहे. मला आशा आहे की डिएगो तुम्हाला त्याची काही सोपी कामे देईल तेव्हा या टिप्स तुम्हाला मदत करतील. ☺"