नहीं हो रही द्वारा यह सुनिश्चित करने के लिए सबसे आसान है, कि संभव नहीं है के दौरान किसी अन्य धागा द्वारा आयोजित नहीं किया गया है। यदि संकलक और JVM ऐसा करने के लिए थे, तो यह संभावना है कि जावा प्रोग्रामिंग भाषा मेमोरी मॉडल द्वारा निर्धारित बाधाओं का उल्लंघन किया जाएगा।
अधिक विशेष रूप से, synchronization order जावा भाषा विशिष्टता में वर्णित आदेश का उल्लंघन किया जाएगा। यदि कोई कंपाइलर या JVM * किसी भी "अवांछित" सिंक्रनाइज़ेशन को हटाना था, तो किसी और ऑप्टिमाइज़ेशन को सिंक्रनाइज़ेशन ऑर्डर (और पहले-पहले) रिश्ते पर डेवलपर द्वारा रखी गई किसी भी धारणा का उल्लंघन करना होगा। आपके विशिष्ट मामले में, पूर्णांक को कोई भी लिखना पढ़ने से पहले, एक कंपाइलर/जेवीएम में जावा मेमोरी मॉडल का पालन करेगा।
एक संकलक/जेवीएम जो सिंक्रनाइज़ेशन को हटा देता है, केवल उस माहौल में परिणाम देगा जहां मेमोरी मॉडल का उल्लंघन होता है। उदाहरण के लिए, इंटीजर वैल्यू के पढ़ने से पहले मेमोरी बाधा रखने वाले कंपाइलर/जेवीएम के बिना विधि-इन-लाइनिंग विधि को निष्पादित किया जा सकता है, जिससे कैश किए गए मान से स्टाल मानों को पढ़ने की अनुमति मिलती है।
* नोट, कंपाइलर/जेवीएम जोड़ी का संदर्भ जानबूझकर है। एक कंपाइलर केवल बाइटकोड उत्सर्जित करेगा जो जेएलएस का अनुपालन करता है; एक जेवीएम में बस एक बग हो सकता है जहां स्मृति मॉडल की आवश्यकताओं का अभी भी उल्लंघन किया जा सकता है। मेमोरी मॉडल की पूर्णता के लिए, कंपाइलर और जेवीएम दोनों को मेमोरी मॉडल द्वारा निर्धारित आवश्यकताओं का पालन करना चाहिए।
स्रोत
2011-08-13 03:01:10
संदिग्ध। यदि आप (प्रोग्रामर) इसे अनावश्यक मानते हैं तो इसे कोड में निर्दिष्ट क्यों करें? – Hyperbole
मैं नहीं करता, लेकिन मान लें कि मैं तीसरे पक्ष के कोड या कोड पर निर्भर करता हूं, मैंने खुद को नहीं लिखा था। – JVerstry