CodeGym /Java Blog /यादृच्छिक /थ्रेड सिंक्रोनाइझेशन. समक्रमित ऑपरेटर
John Squirrels
पातळी 41
San Francisco

थ्रेड सिंक्रोनाइझेशन. समक्रमित ऑपरेटर

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! आज आम्ही मल्टीथ्रेडेड प्रोग्रामिंगच्या वैशिष्ट्यांचा विचार करणे सुरू ठेवू आणि थ्रेड सिंक्रोनाइझेशनबद्दल बोलू. थ्रेड सिंक्रोनाइझेशन.  सिंक्रोनाइझ ऑपरेटर - 1

Java मध्ये सिंक्रोनाइझेशन म्हणजे काय?

प्रोग्रामिंग डोमेनच्या बाहेर, ते दोन डिव्हाइसेस किंवा प्रोग्राम्सना एकत्र काम करण्यास अनुमती देणारी व्यवस्था सूचित करते. उदाहरणार्थ, स्मार्टफोन आणि संगणक Google खात्यासह समक्रमित केले जाऊ शकतात आणि वेबसाइट खाते सोशल नेटवर्क खात्यांसह समक्रमित केले जाऊ शकते जेणेकरून आपण ते साइन इन करण्यासाठी वापरू शकता. थ्रेड सिंक्रोनाइझेशनचा समान अर्थ आहे: ही एक व्यवस्था आहे ज्यामध्ये थ्रेड परस्परसंवाद करतात. एकमेकांना मागील धड्यांमध्ये, आमचे धागे एकमेकांपासून वेगळे राहतात आणि कार्य करतात. एकाने गणना केली, दुसरा झोपला आणि तिसऱ्याने कन्सोलवर काहीतरी प्रदर्शित केले, परंतु त्यांनी संवाद साधला नाही. वास्तविक कार्यक्रमांमध्ये, अशा परिस्थिती दुर्मिळ आहेत. एकाधिक थ्रेड सक्रियपणे कार्य करू शकतात आणि समान डेटा सेटमध्ये बदल करू शकतात. त्यामुळे समस्या निर्माण होतात. एकापेक्षा जास्त थ्रेड्स एकाच ठिकाणी मजकूर लिहित असल्याची कल्पना करा, उदाहरणार्थ, मजकूर फाइल किंवा कन्सोलवर. या प्रकरणात, फाइल किंवा कन्सोल एक सामायिक संसाधन बनते. थ्रेड्सना एकमेकांच्या अस्तित्वाची माहिती नसते, म्हणून ते थ्रेड शेड्युलरने दिलेल्या वेळेत त्यांना शक्य तितके सर्वकाही लिहितात. अलीकडच्या एका धड्यात, हे कोठे जाते याचे उदाहरण आपण पाहिले. आता ते आठवूया: थ्रेड सिंक्रोनाइझेशन.  सिंक्रोनाइझ ऑपरेटर - 2थ्रेड्स त्यांच्या क्रिया एकमेकांशी समन्वय न करता सामायिक संसाधनासह (कन्सोल) कार्य करत आहेत हे कारण आहे. जर थ्रेड शेड्युलरने थ्रेड -1 ला वेळ दिला तर तो कन्सोलवर त्वरित सर्वकाही लिहितो. इतर धाग्यांवर काय आहे किंवा आधीच काय लिहिणे व्यवस्थापित केले नाही हे महत्त्वाचे नाही. परिणाम, जसे आपण पाहू शकता, निराशाजनक आहे. म्हणूनच त्यांनी मल्टीथ्रेडेड प्रोग्रामिंगसाठी म्युटेक्स (म्युच्युअल एक्सक्लूजन) ही विशेष संकल्पना आणली. म्युटेक्सचा उद्देशएक यंत्रणा प्रदान करणे जेणेकरुन एका विशिष्ट वेळी फक्त एका थ्रेडला ऑब्जेक्टमध्ये प्रवेश मिळेल. जर Thread-1 ने ऑब्जेक्ट A चे mutex प्राप्त केले, तर इतर थ्रेड्स ऑब्जेक्टमध्ये प्रवेश आणि सुधारणा करण्यास सक्षम राहणार नाहीत. ऑब्जेक्ट A चे म्युटेक्स रिलीझ होईपर्यंत इतर थ्रेड्सने प्रतीक्षा करणे आवश्यक आहे. हे जीवनातील एक उदाहरण आहे: कल्पना करा की तुम्ही आणि इतर 10 अनोळखी व्यक्ती एका व्यायामात भाग घेत आहात. वळण घेत, आपण आपल्या कल्पना व्यक्त करणे आणि काहीतरी चर्चा करणे आवश्यक आहे. परंतु तुम्ही एकमेकांना प्रथमच पाहत असल्यामुळे, एकमेकांना सतत व्यत्यय आणू नये आणि राग येऊ नये म्हणून तुम्ही 'टॉकिंग बॉल' वापरता: फक्त बॉल असलेली व्यक्ती बोलू शकते. अशा प्रकारे तुमची चांगली आणि फलदायी चर्चा होईल. मूलत:, बॉल एक म्यूटेक्स आहे. ऑब्जेक्टचे म्युटेक्स एका थ्रेडच्या हातात असल्यास, इतर थ्रेड ऑब्जेक्टसह कार्य करू शकत नाहीत.Objectक्लास, म्हणजे Java मधील प्रत्येक ऑब्जेक्ट एक आहे.

सिंक्रोनाइझ ऑपरेटर कसे कार्य करते

चला नवीन कीवर्ड जाणून घेऊया: सिंक्रोनाइझ्ड . हे कोडच्या विशिष्ट ब्लॉकला चिन्हांकित करण्यासाठी वापरले जाते. जर कोड ब्लॉकला कीवर्डने चिन्हांकित केले असेल synchronized, तर तो ब्लॉक एका वेळी एका थ्रेडद्वारे कार्यान्वित केला जाऊ शकतो. सिंक्रोनाइझेशन वेगवेगळ्या प्रकारे लागू केले जाऊ शकते. उदाहरणार्थ, सिंक्रोनाइझ करण्यासाठी संपूर्ण पद्धत घोषित करून:

public synchronized void doSomething() {

   // ...Method logic
}
किंवा कोड ब्लॉक लिहा जिथे काही ऑब्जेक्ट वापरून सिंक्रोनाइझेशन केले जाते:

public class Main {

   private Object obj = new Object();

   public void doSomething() {

       // ...Some logic available simultaneously to all threads

       synchronized (obj) {

           // Logic available to just one thread at a time
       }
   }
}
अर्थ सोपा आहे. कीवर्डसह चिन्हांकित केलेल्या कोड ब्लॉकमध्ये एक थ्रेड गेल्यास synchronized, तो ऑब्जेक्टचे म्युटेक्स झटपट कॅप्चर करतो आणि त्याच ब्लॉक किंवा पद्धतीमध्ये प्रवेश करण्याचा प्रयत्न करत असलेल्या इतर सर्व थ्रेड्सना मागील थ्रेडने त्याचे कार्य पूर्ण होईपर्यंत आणि मॉनिटर रिलीज करेपर्यंत प्रतीक्षा करण्यास भाग पाडले जाते. थ्रेड सिंक्रोनाइझेशन.  सिंक्रोनाइझ ऑपरेटर - 3तसे! अभ्यासक्रमादरम्यान, तुम्ही आधीच ची उदाहरणे पाहिली आहेत synchronized, परंतु ती वेगळी दिसत होती:

public void swap()
{
   synchronized (this)
   {
       // ...Method logic
   }
}
तुमच्यासाठी विषय नवीन आहे. आणि, अर्थातच, वाक्यरचनामध्ये गोंधळ असेल. म्हणून, ते लिहिण्याच्या वेगवेगळ्या पद्धतींमुळे नंतर गोंधळात पडू नये म्हणून ते लगेच लक्षात ठेवा. ते लिहिण्याच्या या दोन पद्धतींचा अर्थ एकच आहे:

public void swap() {

   synchronized (this)
   {
       // ...Method logic
   }
}


public synchronized void swap() {

   }
}
पहिल्या प्रकरणात, पद्धत प्रविष्ट केल्यावर लगेच तुम्ही कोडचा एक समक्रमित ब्लॉक तयार कराल. हे ऑब्जेक्टद्वारे सिंक्रोनाइझ केले जाते this, म्हणजे वर्तमान ऑब्जेक्ट. आणि दुसऱ्या उदाहरणात, तुम्ही synchronizedसंपूर्ण पद्धतीवर कीवर्ड लागू करता. यामुळे सिंक्रोनाइझेशनसाठी वापरला जाणारा ऑब्जेक्ट स्पष्टपणे सूचित करणे अनावश्यक होते. संपूर्ण पद्धत कीवर्डने चिन्हांकित केल्यामुळे, वर्गाच्या सर्व उदाहरणांसाठी पद्धत स्वयंचलितपणे समक्रमित केली जाईल. कोणता मार्ग चांगला आहे याच्या चर्चेत आम्ही पडणार नाही. आत्तासाठी, तुम्हाला सर्वोत्तम वाटेल असा कोणताही मार्ग निवडा :) मुख्य गोष्ट लक्षात ठेवा: तुम्ही सिंक्रोनाइझ केलेली पद्धत केवळ तेव्हाच घोषित करू शकता जेव्हा तिचे सर्व तर्क एका वेळी एकाच थ्रेडद्वारे कार्यान्वित केले जातात. उदाहरणार्थ, खालील पद्धत सिंक्रोनाइझ करणे चूक होईल doSomething():

public class Main {

   private Object obj = new Object();

   public void doSomething() {

       // ...Some logic available simultaneously to all threads

       synchronized (obj) {

           // Logic available to just one thread at a time
       }
   }
}
जसे आपण पाहू शकता, पद्धतीच्या भागामध्ये तर्कशास्त्र आहे ज्यास सिंक्रोनाइझेशनची आवश्यकता नाही. तो कोड एकाच वेळी अनेक थ्रेड्सद्वारे चालवला जाऊ शकतो आणि सर्व गंभीर ठिकाणे वेगळ्या ब्लॉकमध्ये सेट केली जातात synchronized. आणि आणखी एक गोष्ट. नाव अदलाबदलीसह धड्यातून आमचे उदाहरण बारकाईने तपासूया:

public void swap()
{
   synchronized (this)
   {
       // ...Method logic
   }
}
टीप: सिंक्रोनाइझेशन वापरून केले जातेthis. म्हणजेच विशिष्टMyClassवस्तू वापरणे. समजा आपल्याकडे 2 थ्रेड (Thread-1आणिThread-2) आणि फक्त एकMyClass myClassऑब्जेक्ट आहे. या प्रकरणात,Thread-1कॉलmyClass.swap(), ऑब्जेक्टचे म्युटेक्स व्यस्त असेल आणिmyClass.swap()मेथडलाThread-2म्युटेक्स रिलीझ होण्याची वाट पाहत असताना हँग होईल. MyClassजर आमच्याकडे 2 थ्रेड्स आणि 2 ऑब्जेक्ट्स (myClass1आणिअसतील तरmyClass2, आमचे थ्रेड्स एकाच वेळी वेगवेगळ्या ऑब्जेक्ट्सवर सिंक्रोनाइझ केलेल्या पद्धती सहजपणे कार्यान्वित करू शकतात. पहिला थ्रेड हे कार्यान्वित करतो:

myClass1.swap();
दुसरा हे कार्यान्वित करतो:

myClass2.swap();
या प्रकरणात, synchronizedपद्धतीमधील कीवर्ड swap()प्रोग्रामच्या ऑपरेशनवर परिणाम करणार नाही, कारण सिंक्रोनाइझेशन विशिष्ट ऑब्जेक्ट वापरून केले जाते. आणि नंतरच्या बाबतीत, आपल्याकडे 2 वस्तू आहेत. अशा प्रकारे, धागे एकमेकांसाठी समस्या निर्माण करत नाहीत. शेवटी, दोन ऑब्जेक्ट्समध्ये 2 भिन्न म्युटेक्स असतात आणि एक मिळवणे हे दुसरे मिळवण्यापेक्षा स्वतंत्र असते .

स्थिर पद्धतींमध्ये सिंक्रोनाइझेशनची विशेष वैशिष्ट्ये

पण जर तुम्हाला स्टॅटिक पद्धत सिंक्रोनाइझ करायची असेल तर ?

class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

   public static synchronized void swap() {
       String s = name1;
       name1 = name2;
       name2 = s;
   }

}
म्यूटेक्स येथे काय भूमिका बजावेल हे स्पष्ट नाही. तथापि, आम्ही आधीच निर्धारित केले आहे की प्रत्येक ऑब्जेक्टमध्ये म्यूटेक्स आहे. पण समस्या अशी आहे की पद्धत कॉल करण्यासाठी आम्हाला ऑब्जेक्ट्सची आवश्यकता नाही MyClass.swap(): पद्धत स्थिर आहे! मग पुढे काय? :/ येथे प्रत्यक्षात कोणतीही अडचण नाही. Java च्या निर्मात्यांनी सर्व गोष्टींची काळजी घेतली :) जर गंभीर समवर्ती तर्कशास्त्र असलेली पद्धत स्थिर असेल, तर वर्ग स्तरावर समक्रमण केले जाते. अधिक स्पष्टतेसाठी, आम्ही वरील कोड खालीलप्रमाणे पुन्हा लिहू शकतो:

class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

   public static void swap() {

       synchronized (MyClass.class) {
           String s = name1;
           name1 = name2;
           name2 = s;
       }
   }

}
तत्वतः, तुम्ही स्वतः याचा विचार करू शकता: कोणतीही वस्तू नसल्यामुळे, सिंक्रोनाइझेशन यंत्रणा कशीतरी वर्गातच बेक केली पाहिजे. आणि हे असे आहे: आम्ही समक्रमित करण्यासाठी वर्ग वापरू शकतो.
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION