जावा में सिंक्रोनाइज़ेशन: क्या, कैसे और क्यों?



जावा में सिंक्रोनाइज़ेशन पर यह लेख आपको बहु-सूत्रित कार्यक्रमों को सिंक्रनाइज़ करने के बारे में जानने के लिए अपने तरीके से मार्गदर्शन करने में मदद करेगा।

मल्टी-थ्रेडेड प्रोग्राम नियमित रूप से एक ऐसी परिस्थिति के साथ आ सकते हैं जहां कई उसी संसाधन को प्राप्त करने का प्रयास जो कपटपूर्ण और चौंकाने वाले परिणाम उत्पन्न करता है। यह जावा में सिंक्रोनाइज़ेशन का उपयोग करके हल किया जा सकता है। बस एक विशिष्ट धागा समय के दिए गए उद्देश्य से संसाधन को प्राप्त कर सकता है। यह लेख आपको सिंक्रनाइज़ेशन रणनीति से परिचित होने में मदद करेगा।

मैं इस क्रम में विषयों पर चर्चा करूंगा:





आएँ शुरू करें!

जावा में सिंक्रोनाइज़ेशन का उपयोग क्यों करें?



यदि आप किसी प्रोग्राम के अंदर कम से कम दो थ्रेड्स के साथ शुरू करते हैं, तो एक ही मौका हो सकता है जब कई थ्रेड्स एक ही संसाधन पर पहुंचने का प्रयास करते हैं। यह समसामयिक मुद्दों के कारण अप्रत्याशित परिणाम भी पैदा कर सकता है।

वाक्य - विन्यास :

सिंक्रोनाइज़ (ऑब्जेक्टिफायर) {// साझा किए गए चर और अन्य साझा संसाधन}

उदाहरण के लिए, समतुल्य फ़ाइल में लिखने का प्रयास। यह डेटा को दूषित कर सकता है क्योंकि थ्रेड्स में से एक डेटा को ओवरराइड कर सकता है या जब थ्रेड खुल रहा हैएक ही समय पर एक ही फ़ाइल, दूसरा धागा उसी फ़ाइल को बंद कर सकता है।कई थ्रेड्स की क्रिया को सिंक्रनाइज़ करने की आवश्यकता है। इसे एक अवधारणा का उपयोग करके लागू किया जा सकता है onitors



php Print_r सरणी
  • से प्रत्येक एक मॉनिटर के साथ जुड़ा हुआ है, जिसे एक धागा लॉक या अनलॉक कर सकता है।
  • एक समय में केवल एक धागा एक मॉनिटर पर ताला लगा सकता है।
  • जावा प्रोग्रामिंग भाषा थ्रेड बनाने और उनके उपयोग से अपने कार्य को सिंक्रनाइज़ करने का एक बहुत ही आसान तरीका प्रदान करती है सिंक्रोनाइज़ किया हुआ ब्लॉक।
  • यह इस विशेष ब्लॉक के भीतर साझा संसाधनों को भी रखता है।

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

सिंक्रोनाइज़ेशन के प्रकार

मूल रूप से दो प्रकार के सिंक्रनाइज़ेशन उपलब्ध हैं। वे:

  1. प्रक्रिया तुल्यकालन: एक साथ पहुंचने के लिए कई थ्रेड्स या प्रक्रियाओं का एक साथ निष्पादन जैसे कि वे कुछ निश्चित क्रियाओं के लिए प्रतिबद्ध होते हैं।
  2. थ्रेड सिंक्रोनाइज़ेशन: कई बार जब एक से अधिक धागेएक साझा संसाधन तक पहुँचने का प्रयास करता है, आपको यह सुनिश्चित करने की आवश्यकता है कि संसाधन का उपयोग केवल एक थ्रेड द्वारा किया जाएगाएक वक़्त।

आइए इन प्रकारों के विवरण में न जाएं और समझने की कोशिश करें कि ताले क्या हैं

जावा में ताले

जैसा कि मैंने पहले उल्लेख किया है, सिंक्रोनाइज़ेशन एक आंतरिक इकाई के आसपास बनाया जाता है जिसे के रूप में जाना जाता है ताला या निगरानी करें । प्रत्येक वस्तु में एक ताला जुड़ा होता है। तो एक धागा जिसे किसी वस्तु के क्षेत्रों तक लगातार पहुंच की आवश्यकता होती है, उन्हें उपयोग करने से पहले ऑब्जेक्ट के लॉक को प्राप्त करने की आवश्यकता होती है, और फिर काम पूरा होने पर लॉक को छोड़ दें।

जावा 5 से, पैकेज java.util.concurrent.locks में कई लॉक कार्यान्वयन हैं।

यह एक ताला कैसा दिखता है:

पब्लिक क्लास लॉक {प्राइवेट बूलियन isLocked = झूठे पब्लिक सिंक्रोनाइज़्ड void लॉक () थ्रस्ट इंटरप्टेड अपवाद ({isLocked) {वेट ()} isLocked = true} पब्लिक सिंक्रोनाइज़्ड वेक अनलॉक () {.Locked = false सूचित करें ()}}

लॉक () विधि लॉक इंस्टेंस को लॉक करती है ताकि लॉक () अनलॉक होने तक सभी थ्रेडिंग लॉक () अवरुद्ध हो जाएं।

बिना सिंक्रोनाइज़ेशन के मल्टी-थ्रेडिंग

यहां एक सरल उदाहरण है जो एक क्रम में काउंटर मूल्य को प्रिंट करता है और हर बार जब हम इसे चलाते हैं, तो यह एक थ्रेड के लिए सीपीयू उपलब्धता के आधार पर एक अलग परिणाम उत्पन्न करता है। इसकी जांच करें!

वर्ग मल्टीथ्रेड {सार्वजनिक शून्य प्रिंटकाउंट () {कोशिश {के लिए (इंट i = 5 i)<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

इसमें उपरोक्त कार्यक्रम के परिणाम:

आउटपुट- Java- Edureka में सिंक्रोनाइज़ेशन

सिंक्रनाइज़ेशन के साथ मल्टी-थ्रेडिंग

यह ऊपर जैसा ही उदाहरण है, लेकिन यह अनुक्रम में काउंटर मूल्य को प्रिंट करता है। जितनी बार हम इसे चलाते हैं, यह उतना ही परिणाम देता है।

क्लास मल्टीथ्रेड {सार्वजनिक शून्य प्रिंटकाउंट () {try {for (int i = 5 i> 0 i--) {System.out.println ('काउंटर ---' + i)}} कैच (एक्सेप्शन ई) {सिस्टम। out.println ('थ्रेड में बाधा।')}}} क्लास थ्रेड का विस्तार मल्टीथ्रेड {प्राइवेट थ्रेड टी प्राइवेट स्ट्रिंग थ्रेडनाम मल्टीथ्रेड एमटी थ्रेड (स्ट्रिंग नाम, मल्टीट्र्रेड एमटी) {थ्रेडनेम = नाम एमटी / एमटी} सार्वजनिक शून्य रन () {सिंक्रनाइज़ MT) {MT.printCount ()} System.out.println ('थ्रेड' + थ्रेडनेम + 'एग्जाइटिंग')} public void start () {System.out.println ('शुरू' + थ्रेडनेम अगर (t ==) अशक्त) {t = नया थ्रेड (यह, थ्रेडनेम) t.start ()}}} सार्वजनिक वर्ग TestThread {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग args []) {मल्टीथ्रेड एमटी = नया मल्टीथ्रेड () थ्रेड टी = नया थ्रेड ('थ्रेड) - 1 ', MT) थ्रेड T1 = नया थ्रेड (' थ्रेड - 2 ', MT) T.start () T1.start () // थ्रेड्स के समाप्त होने तक प्रतीक्षा करें {T.join () T1.join ()} पकड़ (अपवाद ई) {System.out.println ('बाधित')}}}

आउटपुट नीचे दर्शाया गया है:

सिंक्रोनाइज़्ड की-वर्ड

सिंक्रनाइज़ कीवर्ड एक खंड या एक महत्वपूर्ण खंड को चिह्नित करता है। एक महत्वपूर्ण खंड वह है जहां एक समय में केवल एक धागा निष्पादित होता है, और थ्रेड सिंक्रनाइज़ अनुभाग के लिए लॉक रखता है। यह सिंक्रनाइज़ किया गया कीवर्ड लिखने में मदद करता है समवर्ती किसी भी आवेदन के कुछ हिस्सों। यह ब्लॉक के भीतर साझा संसाधनों की भी रक्षा करता है।

सिंक्रनाइज़ कीवर्ड का उपयोग इसके साथ किया जा सकता है:

कोड ब्लॉक पर चर्चा करते हैं।

जावा में टोस्टिंग विधि क्या है

सिंक्रोनाइज़्ड कीवर्ड: एक कोड ब्लॉक

वाक्य - विन्यास

एक सिंक्रनाइज़ ब्लॉक लिखने के लिए सामान्य वाक्यविन्यास है:

सिंक्रोनाइज़ (लॉकऑब्जेक्ट) {// सिंक्रोनाइज़्ड स्टेटमेंट}

जब कोई थ्रेड ब्लॉक के अंदर सिंक्रनाइज़ किए गए कथनों को निष्पादित करना चाहता है, तो उसे लॉकऑब्जेक्ट के मॉनिटर पर लॉक प्राप्त करना होगा। एक बार में केवल एक धागा किसी लॉक ऑब्जेक्ट के मॉनिटर को अधिग्रहित कर सकता है। इसलिए अन्य सभी थ्रेड्स को तब तक इंतजार करना चाहिए जब तक कि वर्तमान में निष्पादित धागा लॉक को प्राप्त नहीं करता है और इसका निष्पादन समाप्त हो जाता है।
इस तरह, सिंक्रनाइज़ किया गया कीवर्ड गारंटी देता है कि केवल एक धागा एक समय में सिंक्रनाइज़ किए गए ब्लॉक स्टेटमेंट को निष्पादित करेगा, और इस प्रकार कई थ्रेड्स को साझा डेटा को ब्लॉक करने से रोकता है जो ब्लॉक के अंदर मौजूद है।

ध्यान दें :

  • यदि नींद पर एक धागा डाल दिया जाता है (उपयोग करते हुए नींद () विधि) तो यह ताला जारी नहीं करता है। इस सोने के समय के दौरान, कोई भी थ्रेड सिंक्रनाइज़ ब्लॉक स्टेटमेंट को निष्पादित नहीं करेगा।
  • जावा सिंक्रनाइज़ेशन फेंक देंगे शून्य सूचक का अपवाद यदि लॉक ऑब्जेक्ट ‘में उपयोग किया जाता है सिंक्रनाइज़ (लॉक) ' शून्य है।

अब, विधि पर चर्चा करते हैं।

सिंक्रनाइज़ कीवर्ड: एक विधि

वाक्य - विन्यास

लिखने के लिए सामान्य वाक्यविन्यास सिंक्रनाइज़ विधि है:

सिंक्रनाइज़ विधि (पैरामीटर) {// सिंक्रोनाइज़ कोड}

यहाँ तालाबंदी एक वस्तु का संदर्भ है जिसका ताला मॉनिटर से जुड़ा हुआ है जो सिंक्रनाइज़ किए गए कथनों का प्रतिनिधित्व करता है।

सिंक्रनाइज़ ब्लॉक के समान, एक थ्रेड को सिंक्रनाइज़ किए गए विधि के साथ कनेक्टेड मॉनिटर ऑब्जेक्ट पर लॉक प्राप्त करना होगा। सिंक्रनाइज़ विधि के मामले में, लॉक ऑब्जेक्ट है:

  • ‘.Class 'ऑब्जेक्ट - यदि दी गई विधि है स्थिर
  • ‘यह 'वस्तु - अगर विधि है गैर-स्थिर । ‘यह’ उस वर्तमान वस्तु का संदर्भ है जिसमें सिंक्रनाइज़ विधि को लागू किया जाता है।

जावा सिंक्रोनाइज़्ड कीवर्ड है फिर से प्रवेश प्रकृति में। इसका मतलब है कि अगर एक सिंक्रनाइज़ विधि किसी अन्य सिंक्रनाइज़ विधि को कॉल करती है जिसे उसी लॉक की आवश्यकता होती है, तो वर्तमान थ्रेड जो लॉक को पकड़ रहा है, लॉक को प्राप्त किए बिना उस विधि में प्रवेश कर सकता है।

आइए हम इस लेख के अंतिम विषय पर आगे बढ़ें और सिंक्रनाइज़ किए गए कीवर्ड और सिंक्रोनाइज़ेशन ब्लॉक के बीच के प्रमुख अंतर को इंगित करें।

सिंक्रनाइज़ कीवर्ड और सिंक्रनाइज़ ब्लॉक के बीच अंतर

  • जब आप एक साथ सिंक्रनाइज़ कीवर्ड का उपयोग करते हैं तरीका , यह पूरी विधि के लिए ऑब्जेक्ट में एक लॉक प्राप्त करता है। इसका मतलब यह है कि किसी अन्य थ्रेड को किसी भी सिंक्रनाइज़ विधि का उपयोग नहीं किया जा सकता है जब तक कि वर्तमान थ्रेड को लागू नहीं किया जाता है तब तक इसका निष्पादन समाप्त हो जाता है।
  • सिंक्रोनाइज़ किया हुआ खंड मैथा सिंक्रनाइज़ कीवर्ड के निर्दिष्ट होने के बाद ही कोष्ठक के बीच ऑब्जेक्ट में लॉक प्राप्त होता है। इसका मतलब यह है कि ब्लॉक से बाहर निकलने तक कोई भी धागा पहले से ही लॉक की गई वस्तु पर ताला नहीं लगा सकता। लेकिन अन्य थ्रेड्स विधि में मौजूद बाकी कोड तक पहुंचने में सक्षम होंगे।

यह हमें इस लेख के अंत में लाता है, जहां हमने चर्चा की है कि जावा में सिंक्रनाइज़ेशन बिल्कुल कैसे काम करता है। आशा है कि आप इस ट्यूटोरियल में आपके साथ साझा किए गए सभी के साथ स्पष्ट हैं।

इसकी जाँच पड़ताल करो 250,000 से अधिक संतुष्ट शिक्षार्थियों के एक नेटवर्क के साथ एक विश्वसनीय ऑनलाइन शिक्षण कंपनी, एडुरेका द्वारा, दुनिया भर में फैली हुई है। हम आपकी यात्रा के हर कदम पर आपकी मदद करने के लिए यहां हैं, इस साक्षात्कार साक्षात्कार के अलावा बनने के लिए, हम एक पाठ्यक्रम के साथ आते हैं, जो छात्रों और पेशेवरों के लिए बनाया गया है, जो जावा डेवलपर बनना चाहते हैं।

कौन सी स्कैनर क्लास विधि एक स्ट्रिंग पढ़ती है?

क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? कृपया जावा में इस 'तुल्यकालन' के टिप्पणी अनुभाग में इसका उल्लेख करें ' लेख और हम जितनी जल्दी हो सके आप को वापस मिल जाएगा।