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

"तेथे हा खूप मोठा विषय आहे—जावा मेमरी मॉडेल. मुळात, तुम्हाला त्याबद्दल अजून माहिती असण्याची गरज नाही, पण त्याबद्दल ऐकणे उपयुक्त ठरेल."

"सर्व संभाव्य समस्या दूर करण्यासाठी, Java ने त्याची मेमरी मॅनेजमेंट मेकॅनिझम बदलली आहे. आता मेमरी फक्त थ्रेडच्या स्थानिक कॅशे आणि ग्लोबल मेमरीमध्ये विभागली जात नाही - यंत्रणा आणखी चांगली आहे."

"आणि अधिक क्लिष्ट!"

"होय, चांगले आणि अधिक क्लिष्ट. हे विमानासारखे आहे. चालण्यापेक्षा विमानाने उडणे चांगले आहे, परंतु अधिक क्लिष्ट आहे. मी नवीन परिस्थिती अगदी सोप्या पद्धतीने समजावून सांगण्याचा प्रयत्न करेन."

"ते काय घेऊन आले ते येथे आहे. स्थानिक थ्रेड मेमरी सिंक्रोनाइझ करण्यासाठी एक यंत्रणा, 'हॅपेन्स-बिफोर', कोडमध्ये जोडली गेली. अनेक नियम/शर्ती शोधून काढल्या गेल्या. जेव्हा या अटी पूर्ण होतात, तेव्हा मेमरी सिंक्रोनाइझ केली जाते किंवा वर्तमानशी अद्यतनित केली जाते. राज्य

"हे एक उदाहरण आहे:"

ऑर्डर करा धागा १ धागा २
1
2

101
102
103
104
105

201
202
203
204
205
public int y = 1;
public int x = 1;

x = 2;
synchronized(mutex)
{
 y = 2;
}
थ्रेड म्युटेक्स रिलीज होण्याची वाट पाहत आहे

synchronized(mutex)
{
 if (y == x)
 System.out.println("YES");
}

"यापैकी एक अटी म्हणजे रिलीझ केलेल्या म्युटेक्सचे संपादन. जर म्युटेक्स सोडले गेले आणि पुन्हा मिळवले गेले, तर संपादनापूर्वी मेमरी सिंक्रोनाइझ केली जाईल. थ्रेड 2 x आणि y व्हेरिएबल्सची 'नवीनतम' मूल्ये पाहतील, जरी तुम्ही त्यांना अस्थिर घोषित करू नका."

"किती मनोरंजक! आणि या अटी खूप आहेत का?"

"पुरेसे—मेमरी सिंक्रोनाइझ करण्यासाठी येथे काही अटी आहेत:"

  • "एकाच थ्रेडमध्ये, कोणतीही कमांड घडते - स्त्रोत कोडमध्ये त्याचे अनुसरण करणार्‍या कोणत्याही ऑपरेशनपूर्वी."
  • "लॉकचे प्रकाशन घडते - तेच लॉक प्राप्त होण्यापूर्वी."
  • " सिंक्रोनाइझ केलेल्या ब्लॉक/पद्धतीतून  एक्झिट घडते- त्याच मॉनिटरवर सिंक्रोनाइझ ब्लॉक/पद्धत एंटर करण्यापूर्वी."
  • "स्मृतीमध्ये अस्थिर फील्डचे लेखन घडते - तेच अस्थिर क्षेत्र मेमरीमधून वाचले जाण्यापूर्वी."
  • "थ्रेड ऑब्जेक्टच्या रन पद्धतीचा शेवट होतो- join() पद्धत समाप्त होण्यापूर्वी किंवा त्याच थ्रेडमधील ऑब्जेक्टवर isAlive() पद्धत चुकीची परत येते."
  • "थ्रेड ऑब्जेक्टच्या स्टार्ट() पद्धतीला कॉल होतो- त्याच थ्रेडमधील ऑब्जेक्टवर रन() पद्धत सुरू होण्यापूर्वी."
  • "कंस्ट्रक्टरचा शेवट होतो- या वर्गाच्या फायनल() पद्धतीच्या सुरूवातीच्या आधी."
  • " इंटरप्टेडएक्सेप्शन टाकल्यामुळे किंवा isInterrupted() किंवा interrupted() पद्धती वापरून, ही पद्धत कॉल केली गेली आहे हे थ्रेडने ठरवण्यापूर्वी- interrupt() पद्धतीला कॉल येतो . "

"मग, मला वाटले होते त्यापेक्षा हे सर्व थोडे अधिक क्लिष्ट आहे?"

"हो, जरा जास्त क्लिष्ट..."

"धन्यवाद, ऋषी. मी याचा विचार करेन."

"या विषयाची जास्त काळजी करू नका. वेळ येईल जेव्हा तुम्हाला हे सर्व स्वतःहून समजेल. सध्या, घनदाट जंगलात डोकावण्यापेक्षा तुम्हाला मूलभूत गोष्टी समजून घेणे चांगले होईल. Java मशीनचे अंतर्गत कामकाज. Java 9 रिलीझ होईल आणि नंतर सर्वकाही पुन्हा बदलेल."

"ओ_ओ. हो... काही गोष्टी माहीत नसलेले बरे."