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

"वहाँ बहुत बड़ा विषय है - जावा मेमोरी मॉडल। मूल रूप से, आपको अभी इसके बारे में जानने की ज़रूरत नहीं है, लेकिन इसके बारे में सुनना मददगार होगा।"

"सभी संभावित समस्याओं को खत्म करने के लिए, जावा ने अपनी मेमोरी प्रबंधन तंत्र को बदल दिया। अब मेमोरी को केवल एक थ्रेड के स्थानीय कैशे और वैश्विक मेमोरी में विभाजित नहीं किया जाता है - तंत्र और भी बेहतर है।"

"और अधिक जटिल!"

"हाँ, बेहतर और अधिक जटिल। यह एक हवाई जहाज की तरह है। हवाई जहाज़ से उड़ना चलने से बेहतर है, लेकिन अधिक जटिल है। मैं नई स्थिति को बहुत सरलता से समझाने की कोशिश करूँगा।"

"यहां बताया गया है कि वे क्या लेकर आए। स्थानीय थ्रेड मेमोरी को सिंक्रनाइज़ करने के लिए एक तंत्र, जिसे 'होता है-पहले' कहा जाता है, को कोड में जोड़ा गया था। कई नियमों/शर्तों का आविष्कार किया गया था। जब ये शर्तें संतुष्ट होती हैं, तो मेमोरी को सिंक्रोनाइज़ किया जाता है या वर्तमान में अपडेट किया जाता है। राज्य।

"यहाँ एक उदाहरण है:"

आदेश थ्रेड 1 धागा 2
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 के 'नवीनतम' मान देखेगा, भले ही आप उन्हें अस्थिर घोषित नहीं करते।"

"कितना दिलचस्प है! और क्या इनमें से बहुत सारी शर्तें हैं?"

"पर्याप्त—यहाँ स्मृति को सिंक्रनाइज़ करने के लिए कुछ शर्तें हैं:"

  • "एक ही धागे के भीतर, कोई भी आदेश होता है- किसी भी ऑपरेशन से पहले जो स्रोत कोड में इसका अनुसरण करता है।"
  • "लॉक का विमोचन होता है - उसी लॉक के अधिग्रहण से पहले।"
  • "एक सिंक्रनाइज़ ब्लॉक/विधि  से बाहर निकलना होता है- समान मॉनीटर पर सिंक्रनाइज़ ब्लॉक/विधि दर्ज करने से पहले।"
  • "स्मृति के लिए एक अस्थिर क्षेत्र का लेखन होता है- उसी अस्थिर क्षेत्र को स्मृति से पढ़ने से पहले।"
  • "थ्रेड ऑब्जेक्ट की रन विधि का अंत होता है- जॉइन() विधि समाप्त होने से पहले या isAlive() विधि उसी थ्रेड में ऑब्जेक्ट पर झूठी होती है।"
  • "थ्रेड ऑब्जेक्ट की प्रारंभ () विधि के लिए एक कॉल होती है- रन से पहले () विधि उसी थ्रेड में ऑब्जेक्ट पर शुरू होती है।"
  • "कन्स्ट्रक्टर का अंत होता है - इस वर्ग की अंतिम () विधि की शुरुआत से पहले।"
  • "इंटरप्ट () मेथड के लिए एक कॉल होता है - इससे पहले कि थ्रेड यह निर्धारित करता है कि इस मेथड को कॉल किया गया है, या तो एक इंटरप्टेड एक्सेप्शन को फेंक दिया गया है या isInterrupted () या इंटरप्टेड () विधियों का उपयोग करके।"

"तो, यह सब मेरे विचार से थोड़ा अधिक जटिल है?"

"हाँ, थोड़ा और जटिल ..."

"धन्यवाद, ऋषि। मैं इसके बारे में सोचूंगा।"

"इस विषय के बारे में ज्यादा चिंता न करें। समय आएगा जब आप यह सब अपने आप समझ जाएंगे। अभी के लिए, आपके लिए बेहतर होगा कि आप घने जंगल में जाने के बजाय बुनियादी बातों को समझें। जावा मशीन की आंतरिक कार्यप्रणाली। जावा 9 जारी किया जाएगा और फिर सब कुछ फिर से बदल जाएगा।"

"O_o। हाँ... कुछ चीज़ें न जानना ही बेहतर है।"