Java मध्ये मल्टीथ्रेडिंग

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

कोणत्याही डेव्हलपरला रिड अँड राइट ऑपरेशन्स दरम्यान थ्रेड्ससह काम सिंक्रोनाइझ करणे आवश्यक आहे ज्यांच्यासाठी अनेक थ्रेड वाटप केले आहेत.

हे महत्वाचे आहे की संसाधनामध्ये प्रवेश करताना तुमच्याकडे अद्ययावत डेटा असेल जेणेकरून दुसरा थ्रेड तो बदलू शकेल आणि तुम्हाला सर्वात अद्ययावत माहिती मिळेल. जरी आपण बँक खात्याचे उदाहरण घेतले तरी पैसे येईपर्यंत आपण ते वापरू शकत नाही, त्यामुळे नेहमी अद्ययावत डेटा असणे आवश्यक आहे. Java मध्ये थ्रेड्स सिंक्रोनाइझ आणि व्यवस्थापित करण्यासाठी विशेष वर्ग आहेत.

थ्रेड वस्तू

हे सर्व मुख्य (मुख्य) थ्रेडपासून सुरू होते, म्हणजे, कमीतकमी तुमच्या प्रोग्राममध्ये आधीपासूनच एक चालू धागा आहे. मुख्य थ्रेड कॉल करण्यायोग्य किंवा रन करण्यायोग्य वापरून इतर थ्रेड तयार करू शकतो . निर्मिती केवळ रिटर्न रिझल्टमध्ये भिन्न असते, रननेबल परिणाम देत नाही आणि चेक केलेला अपवाद टाकू शकत नाही. म्हणून, तुम्हाला फाइल्ससह कार्यक्षम कार्य तयार करण्याची चांगली संधी मिळते, परंतु हे खूप धोकादायक आहे आणि तुम्ही सावधगिरी बाळगणे आवश्यक आहे.

वेगळ्या CPU कोरवर थ्रेड एक्झिक्यूशन शेड्यूल करणे देखील शक्य आहे. सिस्टम थ्रेड्समध्ये सहजतेने फिरू शकते आणि योग्य सेटिंग्जसह विशिष्ट थ्रेड कार्यान्वित करू शकते: म्हणजे, डेटा वाचणारा थ्रेड प्रथम कार्यान्वित केला जातो, आमच्याकडे डेटा होताच, आम्ही ते प्रमाणीकरणासाठी जबाबदार असलेल्या थ्रेडकडे पाठवतो, त्यानंतर आम्ही काही व्यावसायिक तर्क अंमलात आणण्यासाठी थ्रेडवर पास करतो आणि नवीन धागा त्यांना परत लिहितो. अशा परिस्थितीत, 4 थ्रेड डेटावर प्रक्रिया करत आहेत आणि प्रत्येक गोष्ट एका थ्रेडपेक्षा वेगाने कार्य करेल. असा प्रत्येक प्रवाह मूळ OS प्रवाहात रूपांतरित केला जातो, परंतु ते कसे रूपांतरित केले जाईल हे JVM अंमलबजावणीवर अवलंबून असते.

थ्रेड क्लास थ्रेड तयार करण्यासाठी आणि काम करण्यासाठी वापरला जातो. यात मानक नियंत्रण यंत्रणा आहेत, तसेच अमूर्त आहेत, जसे की java.util.concurrent वरील वर्ग आणि संग्रह .

Java मध्ये थ्रेड सिंक्रोनाइझेशन

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

Java मधील थ्रेड सिंक्रोनाइझेशन मॉनिटर्सद्वारे हाताळले जाते, ही एक उच्च-स्तरीय यंत्रणा आहे जी एका वेळी एकाच मॉनिटरद्वारे संरक्षित कोडचा एक ब्लॉक कार्यान्वित करण्यासाठी फक्त एका थ्रेडला अनुमती देते. मॉनिटर्सचे वर्तन लॉकच्या दृष्टीने मानले जाते; एक मॉनिटर - एक लॉक.

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

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

जेव्हा एखादा नवीन थ्रेड मॉनिटर कॅप्चर करतो, तेव्हा आम्हाला कोडच्या त्या ब्लॉकमध्ये प्रवेश आणि कार्यान्वित करण्याची क्षमता मिळते आणि त्या वेळी व्हेरिएबल्स मुख्य मेमरीमधून लोड केले जातील. त्यानंतर आपण मॉनिटरच्या मागील प्रकाशनाद्वारे दृश्यमान केलेल्या सर्व नोंदी पाहू शकतो.

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

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

Java मधील अस्थिर फील्ड

जर व्हेरिएबल अस्थिर म्हणून चिन्हांकित केले असेल , तर ते जागतिक स्तरावर उपलब्ध आहे. याचा अर्थ असा की जर थ्रेडने अस्थिर व्हेरिएबलमध्ये प्रवेश केला, तर कॅशेमधील मूल्य वापरण्यापूर्वी त्याला त्याचे मूल्य मिळेल.

लेखन मॉनिटर रिलीझसारखे कार्य करते आणि वाचन मॉनिटर कॅप्चरसारखे कार्य करते. प्रवेश "पूर्वी केलेल्या" प्रकाराच्या संबंधात केला जातो. जर तुम्ही हे शोधून काढले तर, थ्रेड A ला ज्वलंत व्हेरिएबल ऍक्सेस केल्यावर जे दृश्यमान होईल ते थ्रेड B साठीचे व्हेरिएबल आहे. म्हणजेच, तुम्ही इतर थ्रेड्समधील बदल गमावणार नाही याची हमी दिली जाते.

अस्थिर व्हेरिएबल्स अणू असतात, म्हणजेच असे व्हेरिएबल वाचताना, लॉक मिळवताना समान प्रभाव वापरला जातो - मेमरीमधील डेटा अवैध किंवा चुकीचा घोषित केला जातो आणि अस्थिर व्हेरिएबलचे मूल्य पुन्हा मेमरीमधून वाचले जाते . लिहिताना, मेमरीवरील प्रभाव वापरला जातो, तसेच लॉक सोडताना - एक अस्थिर फील्ड मेमरीवर लिहिले जाते.

जावा समवर्ती

तुम्हाला सुपर-कार्यक्षम आणि मल्टी-थ्रेडेड अॅप्लिकेशन बनवायचे असल्यास, तुम्ही JavaConcurrent लायब्ररीमधील वर्ग वापरणे आवश्यक आहे , जे java.util.concurrent पॅकेजमध्ये आहेत .

लायब्ररी खूप मोठी आहे आणि त्याची कार्यक्षमता भिन्न आहे, म्हणून आत काय आहे ते पाहू आणि काही मॉड्यूलमध्ये विभागू:

जावा समवर्ती

समवर्ती संग्रह हे बहु-थ्रेडेड वातावरणात काम करण्यासाठी संग्रहांचा संच आहे. संपूर्ण संग्रहामध्ये प्रवेश अवरोधित करून मूलभूत रॅपर Collections.synchronizedList ऐवजी, डेटा विभागांवर लॉक वापरले जातात किंवा समांतर डेटा वाचण्यासाठी प्रतीक्षा-मुक्त अल्गोरिदम वापरले जातात.

रांगा - बहु-थ्रेडेड वातावरणात काम करण्यासाठी नॉन-ब्लॉकिंग आणि ब्लॉकिंग रांग. नॉन-ब्लॉकिंग रांग थ्रेड्स ब्लॉक न करता गती आणि ऑपरेशनवर लक्ष केंद्रित करतात. तुम्हाला प्रोड्युसर किंवा कंझ्युमर थ्रेड्स “मंद” करण्याची आवश्यकता असताना ब्लॉकिंग रांग कामासाठी योग्य असतात. उदाहरणार्थ, ज्या परिस्थितीत काही अटींची पूर्तता केली जात नाही, रांग रिकामी किंवा भरलेली आहे किंवा मोफत ग्राहक नाही .

सिंक्रोनाइझर्स हे थ्रेड्स सिंक्रोनाइझ करण्यासाठी उपयुक्तता आहेत. ते "समांतर" संगणनात एक शक्तिशाली शस्त्र आहेत.

एक्झिक्युटर्स हे थ्रेड पूलच्या अधिक सोयीस्कर आणि सुलभ निर्मितीसाठी एक फ्रेमवर्क आहे, परिणाम प्राप्त करून असिंक्रोनस कार्यांचे शेड्यूलिंग सेट करणे सोपे आहे.

बेसिक सिंक्रोनाइझ , प्रतीक्षा करा , सूचित करा , सर्व सूचना करा .

अणुशास्त्र हे असे वर्ग आहेत जे आदिम आणि संदर्भांवरील अणू ऑपरेशनला समर्थन देऊ शकतात.