5

मैं Effective Java से डबल चेक लॉकिंग के बारे में पढ़ रहा हूं।
कोड निम्नलिखित है:स्थानीय परिवर्तनीय सहायता को यहां कैसे निर्दिष्ट किया जाता है?

private volatile FieldType field; 
FieldType getField() { 
    FieldType result = field; 
    if (result == null) { // First check (no locking) 
     synchronized(this) { 
     result = field; 
     if (result == null) // Second check (with locking) 
      field = result = computeFieldValue(); 
     } 
    } 
    return result; 
}  

इसमें कहा गया है कि result का उपयोग कर अनावश्यक लगता है, लेकिन वास्तव में सुनिश्चित करता है कि field केवल केवल आम मामले में जहां यह पहले से ही आरंभ नहीं हो जाता में एक बार पढ़ा जाता है।
लेकिन मुझे यह समझ में नहीं आता है।
if(field == null) सीधे करने में क्या अंतर है?
मुझे नहीं मिलता है क्यों if (result == null) अलग है, जैसा कि कहा गया है अकेले बेहतर दें।
कृपया इसे समझने में कोई मदद?

+2

के लिए रीडरिंग निर्देशों पर सीमा लगाता है क्या विधि का आगे उपयोग किया जा रहा है? –

+1

हम "आदि" देखना चाहते हैं ... प्रभावी जावा के लिए पृष्ठ संदर्भ क्या है? मेरे पास मेरी प्रतिलिपि नहीं है - लेकिन अन्य शायद। –

+0

@VictorSorokin: अद्यतन – Jim

उत्तर

4

उस उदाहरण में सोच यह है कि परिणाम/फ़ील्ड का अनुमान लगाया जाएगा कि मुझे एक से अधिक बार अनुमान लगाया जाएगा। result तक पहुंच सस्ता है (यह अस्थिर नहीं है)।

अन्यथा वापसी करते समय आपके पास दूसरा अस्थिर पढ़ा जाता है।

यदि आपको ऐसा करने की आवश्यकता है तो मांग धारक पैटर्न पर प्रारंभिकizaton का उपयोग करें। http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom

के लिए अच्छी तरह से ... स्पष्टता जवाब ही टिप्पणी में मेरी स्पष्टीकरण के कुछ जोड़ना:

लघु संस्करण: एक स्थानीय चर बस (में से एक) cpu में एक रजिस्टर में हो सकता है (रों) (और सीपीयू के कोर में से एक में यदि एकाधिक आदि)। जितना तेज़ हो जाता है उतना तेज़ हो जाता है। अन्य कोर/कैश/सीपीयू/मेमोरी में बदलावों के लिए एक अस्थिर चर की जांच की जानी चाहिए, लेकिन विवरण बहुत हार्डवेयर विशिष्ट (कैश लाइन, मेमोरी बाधा आदि) हो सकते हैं।लेकिन यह भी जेवीएम विशिष्ट है, (हॉटस्पॉट सर्वर कंपाइलर उदाहरण के लिए गैर अस्थिर चर उत्पन्न कर सकता है) और यह संभावित प्रदर्शन लाभ के साथ-साथ

+0

आप यह उल्लेख करना चाहेंगे कि जावा में 'अस्थिर' का क्या अर्थ है: http://en.wikipedia.org/wiki/Volatile_variable#In_Java – ArjunShankar

+0

@ पलसर: तो 'अस्थिर' तक पहुंचने के लिए यह अधिक महंगा है? – Jim

+0

@ जिम - हाँ। मैंने चिपकाया लिंक पढ़ें। – ArjunShankar

5

विवरण (मेरे द्वारा जोर) अगले पन्ने पर है:

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

संदर्भ के लिए, उद्धरण पी से है। आइटम 71 का 284: प्रभावशाली जावा 2 संस्करण में आलसी प्रारंभिक का उपयोग करें।

अद्यतन: बनाम एक अस्थिर चर एक स्थानीय पढ़ने के बीच अंतर यह है कि पूर्व बेहतर अनुकूलित किया जा सकता है। अस्थिर चर को रजिस्टरों या कैश में संग्रहीत नहीं किया जा सकता है, न ही उन पर मेमोरी ऑपरेशंस को फिर से व्यवस्थित किया जा सकता है। इसके अलावा, एक अस्थिर चर पढ़ने से विभिन्न धागे के बीच स्मृति सिंक्रनाइज़ेशन ट्रिगर हो सकता है। वाष्पशील चर अधिक जानकारी के लिए:

अभ्यास, खंड 3.1.4 में जावा संगामिति देखें।

+2

यह वास्तव में प्रश्न का उत्तर नहीं देता है और ओपी ने पहले ही स्पष्टीकरण देखा है। – assylias

+0

@ वासिलियास, "यह प्रदर्शन में सुधार कैसे कर सकता है" सवाल का जवाब नहीं देता ??? –

+1

मुझे लगता है कि सवाल यह है कि यह प्रदर्शन में सुधार कैसे करता है? – assylias