2012-05-03 16 views
7

मैं जावा चश्मा में यह देख रहा हूँ:जावा पुनर्व्यवस्था और स्मृति मॉडल

x और y एक ही धागे और एक्स की कार्रवाई कर रहे हैं, कार्यक्रम के क्रम में y से पहले आता है तो एक्स y से पहले होता है।

है और यह भी इस

मूल कोड
थ्रेड 1
r2 = एक;
बी = 1;

वैध संकलक परिवर्तन
थ्रेड 1
बी = 1 (compilers जब इस अलगाव में है कि धागे के निष्पादन को प्रभावित नहीं करता है, या तो धागा निर्देश को पुन: व्यवस्थित करने के लिए अनुमति दी जाती है);
r2 = एक;

मैं उन दो चीजों के साथ उलझन में हूँ।
एक कार्रवाई एक्स एक कार्रवाई y से पहले आता है, तो फिर एक्स y से पहले होना चाहिए। यदि हम y = x के लिए r2 = A और y = 1 के लिए मानते हैं, तो r = = ए बी = 1 से पहले होना चाहिए। कोई रीडरिंग कैसे हो सकता है, बी = 1 को आर 2 = ए से पहले कैसे निष्पादित किया जाता है यदि एक्स पहले सच होता है तो सच होता है?

उत्तर

13

JLS विशेष रूप से की Section 17.4.5 इस बाहर लाता है:

यह ध्यान देने योग्य है कि एक होता है-पहले दो कार्यों के बीच के रिश्ते की उपस्थिति से आवश्यक मतलब यह नहीं है कि वे इसी क्रम में जगह लेने के लिए है कि एक कार्यान्वयन में। यदि पुनर्गठन कानूनी निष्पादन के अनुरूप परिणाम उत्पन्न करता है, तो यह अवैध नहीं है।

यदि यह मदद करता है, की जगह "होता है-पहले" "wurfles" हर जगह कल्पना के साथ, ताकि आपके अंतर्ज्ञान खेलने में नहीं आता है कि क्या इसका मतलब यह है के बारे में। आप उन गारंटीओं की अपेक्षा कर रहे हैं जो कल्पना में मौजूद नहीं हैं - नामकरण के कारण, मुझे संदेह है।

+0

पर क्या JLS कहते आधार पर: JIT फैसला करता है कि एक * पहले * अगर वहाँ दो घटनाओं के बीच कोई निर्भरता है सही (अगर वे स्वतंत्र हैं) की जरूरत नहीं है क्या होता है ?. यह पैराग्राफ जेआईटी अनुकूलन को इंगित कर रहा है? – TheLostMind

+0

@TheLostMind: ठीक है, या तो JIT अनुकूलन या बस JIT नहीं * को हटाने * सीपीयू अनुकूलन –

+0

उस मामले में, * अंत में *, एक * से पहले होता है * मौजूद नहीं है। मैं इस में * बचने के विश्लेषण * के हाथ की गंध करता हूं: पी – TheLostMind

संबंधित मुद्दे