सिंक्रोनाइज़्ड का उपयोग करना - 1

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

"हाँ, मैं यहाँ हूँ, मैं यहाँ हूँ।"

"आज, मैं आपको व्यवहार में सिंक्रनाइज़ का उपयोग करने के बारे में बताऊंगा ।"

"जब किसी प्रोग्राम में कई ऑब्जेक्ट और थ्रेड्स होते हैं, तो अक्सर ऐसा होता है कि कई थ्रेड्स एक ही ऑब्जेक्ट के साथ एक साथ काम करते हैं। ऐसा करने में, थ्रेड्स एक दूसरे के साथ हस्तक्षेप करते हैं।"

"हाँ, मुझे यह पहले से ही पता है।"

"तो, मान लें कि आपके पास एक वस्तु है जिसे कई थ्रेड्स द्वारा एक्सेस किया जा रहा है। आप समस्याओं से बचने के लिए दो काम कर सकते हैं।"

"पहले हर उस स्थान को लपेटने के लिए सिंक्रोनाइज़्ड ब्लॉक का उपयोग करना है जहाँ ऑब्जेक्ट एक्सेस किया जाता है। लेकिन यह तरीका काम नहीं कर सकता है अगर कुछ प्रोग्रामर कोड लिखता है जो बिना सिंक्रोनाइज़्ड ब्लॉक के ऑब्जेक्ट को सीधे एक्सेस करता है।"

"इसलिए, एक दूसरे दृष्टिकोण का उपयोग ज्यादातर समय किया जाता है - वस्तु को थ्रेड-सुरक्षित बनाना।" "दूसरे शब्दों में, सिंक्रोनाइज़्ड मैकेनिज़्म ऑब्जेक्ट में ही बनाया गया है: यह अपने तरीकों को सिंक्रोनाइज़ करता है और / या कोड को सिंक्रोनाइज़्ड ब्लॉक्स में अपने तरीकों के अंदर लपेटता है।"

"तो कोई वस्तु जो मैं कई धागे से उपयोग कर सकता हूं, और यह कार्यक्रम में लगभग सभी वस्तुएं हैं, मुझे थ्रेड-सुरक्षित बनाना है?"

"सामान्य तौर पर, हाँ। वास्तव में, एक प्रोग्राम में सभी ऑब्जेक्ट अलग-अलग थ्रेड्स द्वारा उपयोग नहीं किए जाते हैं, लेकिन आमतौर पर बहुत सारे होते हैं। इसलिए, जब आप किसी थ्रेड के लिए कोड लिखना शुरू करते हैं और उससे विभिन्न ऑब्जेक्ट्स एक्सेस करते हैं, तो प्रत्येक विधि कॉल के साथ आपको खुद से पूछना चाहिए, «क्या यह कॉल सुरक्षित है?»"

"सुरक्षित?"

"थ्रेड-सेफ, जिसका अर्थ है कि इसे कई थ्रेड्स से सुरक्षित रूप से कॉल किया जा सकता है।"

"यहां कुछ उदाहरण दिए गए हैं। मान लीजिए कि आपके पास एक स्ट्रिंग ऑब्जेक्ट है जिसे विभिन्न थ्रेड्स से एक्सेस किया गया है। जैसा कि आपको पहले से ही याद रखना चाहिए था, स्ट्रिंग अपरिवर्तनीय है - जैसा कि अन्य सभी आदिम प्रकार हैं। इसका मतलब यह है कि एक ऑब्जेक्ट बनने के बाद नहीं बदलता है। इसका मतलब है कि ऐसी वस्तु को "तोड़ना" असंभव है। सभी अपरिवर्तनीय वस्तुएं थ्रेड-सुरक्षित हैं।"

"ठीक है, इससे चीजें आसान हो जाती हैं।"

"अब, मान लीजिए कि आपको एक परिवर्तनशील स्ट्रिंग की आवश्यकता है।"

"हाँ, मुझे याद है। ऐसे दो प्रकार के तार हैं: StringBuffer और StringBuilder। StringBuffer StringBuilder की तरह है, लेकिन इसके सभी तरीके सिंक्रनाइज़ हैं। क्या यह थ्रेड-सुरक्षित भी है?"

"हाँ। यदि आपको एक स्ट्रिंगबिल्डर ऑब्जेक्ट को कई थ्रेड्स से एक्सेस करने की आवश्यकता है, तो आपको इसे स्ट्रिंगबफ़र से बदलना होगा। अन्यथा, जल्दी या बाद में थ्रेड्स इसे एक ही समय में बदल देंगे और इसे «ब्रेक" कर देंगे।

"क्या होगा यदि विभिन्न थ्रेड्स से एक्सेस की जा रही वस्तु मेरी अपनी कक्षा की वस्तु है? क्या मुझे इस मामले में भी इसके तरीकों में सिंक्रनाइज़ करने की आवश्यकता है?"

"हाँ। इस नियम का पालन करना सबसे अच्छा है: विभिन्न थ्रेड्स से एक्सेस की जाने वाली सभी वस्तुओं को थ्रेड-सुरक्षित होना चाहिए।"

"अच्छा। मैंने नहीं सोचा था कि सब कुछ इतना गंभीर था। धन्यवाद, ऐली।"

"आपका स्वागत है। मुझे उम्मीद है कि जब डिएगो अपने कुछ आसान काम आपको बताएगा तो ये सुझाव आपकी मदद करेंगे। ☺"