2012-11-01 8 views
8

मैं JDK में java.lang.Class.newInstance0() में निम्नलिखित नोट में आए 1.7 अपडेट 7:क्यों java.lang.Class.newInstance0() जावा स्मृति मॉडल के तहत सख्ती से सही नहीं है?

नोट: निम्न कोड वर्तमान जावा स्मृति मॉडल के तहत सख्ती से सही नहीं हो सकता।

किसी को क्यों कृपया समझा सकते हैं?

+0

आप प्रासंगिक "कोड निम्नलिखित" का हवाला देते हैं कृपया सकता है? – Vlad

+0

मुझे नोट मिला (धन्यवाद google) http://cr.openjdk.java.net/~jrose/7030453/webrev.00/raw_files/new/src/share/classes/java/lang/Class.java – Augusto

+0

तरह का DCL? http://www.javaworld.com/jw-02-2001/jw-0209-double.html – Flot2011

उत्तर

5

इस कोड में एकमात्र मुद्दा जो मैं देख सकता हूं वह यह है कि "कैश्डकॉन्स्ट्रक्टर" फ़ील्ड अस्थिर है, जबकि यह धागे के बीच मूल्य दृश्यता प्रभाव की गारंटी देता है, इस विशेष कोड ब्लॉक में एक क्विर्क है कि अलग-अलग थ्रेड कैश किए गए हैं कंसस्ट्रक्टर मूल्य से पहले शून्य धागे में से एक द्वारा आवंटित किया जाएगा, यानी प्रारंभिक अनुक्रम परमाणु नहीं है। यह केवल नेतृत्व कर सकते हैं कि एक साथ cachedConstructor बार की जोड़ी सौंपा जा सकता है, लेकिन अगर कोई भी विशेष रूप से निर्भर करता है कि यह वही निर्माता उदाहरण होगा कोड को तोड़ने नहीं होंगे। cachedConstructor initialisation ब्लॉक सिंक्रनाइज़ किया जाएगा, तो यह परमाणु हो जाएगा, अर्थात cachedConstructor एक बार रेस स्थिति की परवाह किए बिना ही सौंपा।

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

+0

तब मुझे लगता है कि टिप्पणी के लेखक उस नोट में थोड़ा स्पष्ट होना चाहिए था। स्पष्टीकरण देने के लिए धन्यवाद। – SpaceTrucker

1

वर्तमान जावा स्मृति मॉडल

सवाल "कैसे वर्तमान" है।

कोड का वह टुकड़ा बहुत प्राचीन, 1.4 या इससे पहले की संभावना है, और किसी ने इसे तब तक छुआ नहीं है।

लेखक शायद जानते हैं कि एक नया स्मृति मॉडल पर काम किया जा रहा था।

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