जेएमएम में औपचारिकता इसका सबसे भ्रमित हिस्सा प्रतीत होता है। मेरे पास जेएमएम कारणता के संबंध में कुछ प्रश्न हैं, और समवर्ती कार्यक्रमों में व्यवहार की अनुमति है।जावा मेमोरी मॉडल में इस व्यवहार की अनुमति क्यों है?
जैसा कि मैं समझता हूं, वर्तमान जेएमएम हमेशा कारणता लूप को प्रतिबंधित करता है। (मैं सही हूँ?)
अब, प्रति JSR-133 दस्तावेज़, पृष्ठ 24 के रूप में, Fig.16, हम एक उदाहरण है जहां:
प्रारंभ मेंx = y = 0
थ्रेड 1:
r3 = x;
if (r3 == 0)
x = 42;
r1 = x;
y = r1;
थ्रेड 2:
r2 = y;
x = r2;
सहजता से, r1 = r2 = r3 = 42
असंभव लगता है। हालांकि, यह केवल इतना संभव नहीं है, बल्कि जेएमएम में 'अनुमति' भी है।
संभावना के लिए, दस्तावेज है जो मैं समझने में विफल से विवरण है:
एक संकलक यह समझ सकते हैं कि केवल मूल्यों कभी
x
करने के लिए सौंपा 0 और 42 कि से, संकलक कर सकता हैं उस बिंदु को घटाएं, पर जहां हमr1 = x
निष्पादित करते हैं, या तो हमने 42 सेx
का लेखन किया था, या हमने केवलx
पढ़ा था और मूल्य 42 देखा था। किसी भी मामले में, यह पढ़ने के लिए कानूनी होगाx
मूल्यदेखने के लिए42. फिर यहr1 = x
सेr1 = 42
बदल सकता है; यहy = r1
कोy = 42
में परिवर्तित करने और पहले प्रदर्शन करने की अनुमति देगा, जिसके परिणामस्वरूप प्रश्न में व्यवहार होगा। इस मामले में,y
पर लिखें पहले किया गया है।
मेरा प्रश्न है, यह वास्तव में किस तरह का संकलक अनुकूलन है? (मैं कंपाइलर-अज्ञानी हूं।) चूंकि 42 केवल सशर्त रूप से लिखा गया है, जब if
कथन संतुष्ट है, तो संकलक x
के लेखन के साथ कैसे जा सकता है?
दूसरे, भले ही संकलक यह सट्टा अनुकूलन करता है, और y = 42
और करता है तो अंत में r3 = 42
बनाता है, यह करणीय पाश का उल्लंघन नहीं है, के बाद से वहाँ कोई कारण है और प्रभाव भेद अब छोड़ दिया है?
वास्तव में एक ही दस्तावेज़ (पृष्ठ 15, चित्रा 7) में एक उदाहरण है जहां एक समान कारण लूप को अस्वीकार्य माना जाता है।
तो जेएमएम में यह निष्पादन आदेश कानूनी कैसे है?
@Alexei इसमें से कुछ बताते हैं। लेकिन, कंपाइलर को 'r3 = 42' के बजाय' r3 = 0' नहीं बनाना चाहिए? या वे सिर्फ 'एक संभावना' दिखा रहे हैं! – gaganbm
कंपाइलर 'r3 = 42' नहीं बनाता है, यह सिर्फ' r3 = x' बरकरार है। कंपाइलर अनुकूलन हमेशा अधिकतम गहराई में नहीं किया जाता है। यदि न्यूनतम संभावना है कि अनुकूलन शुद्धता का उल्लंघन कर सकता है, तो इसे छोड़ दिया जाता है। दिए गए कोड में, ऐसी कोई परिस्थितियां नहीं हैं, लेकिन अगर कोई अन्य कोड मौजूद है तो वे प्रकट हो सकते हैं। इसके अलावा, संकलक यह तय कर सकता है कि 'r3 = 0'' r3 = x' के समान मूल्य का है। –