मैं प्रभावी जावा (द्वितीय संस्करण) के आइटम 71 के माध्यम से अपना रास्ता काम कर रहा हूं, "आलसी प्रारंभिक रूप से आलसी रूप से उपयोग करें"। यह इस कोड का उपयोग उदाहरण के क्षेत्रों (पृष्ठ 283) के आलसी आरंभीकरण के लिए दोबारा जांच मुहावरा के उपयोग का सुझाव देते हैं:'प्रभावी जावा' conundrum: इस समवर्ती कोड में अस्थिर क्यों आवश्यक है?
अस्थिर क्यों है:
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; }
तो, मैं वास्तव में कई प्रश्न हैं संशोधक
field
पर आवश्यक है कि प्रारंभिक सिंक्रनाइज़ ब्लॉक में होता है? यह पुस्तक इस सहायक पाठ को प्रदान करती है: "अगर फ़ील्ड पहले ही शुरू हो चुकी है तो लॉकिंग नहीं है, इसलिए यह महत्वपूर्ण है कि फ़ील्ड को अस्थिर घोषित किया जा सकता है"। इसलिए, क्या यह मामला है कि एक बार क्षेत्र शुरू होने के बाद, अस्थिरता अन्य सिंक्रनाइज़ेशन की कमी के कारणfield
पर कई धागे के निरंतर विचारों की एकमात्र गारंटी है? यदि हां, तो getField() को सिंक्रनाइज़ क्यों नहीं करें या यह मामला है कि उपर्युक्त कोड बेहतर प्रदर्शन प्रदान करता है?पाठ चलता है कि नहीं-आवश्यक स्थानीय चर,
result
, "यह सुनिश्चित करें किfield
मामले ऐसे यह पहले से ही प्रारंभ कर रहा है में केवल एक बार पढ़ने के लिए है", जिससे प्रदर्शन में सुधार किया जाता है। यदिresult
हटा दिया गया था, तोfield
सामान्य मामले में कई बार पढ़ा जाएगा जहां यह पहले से ही प्रारंभ किया गया था?
इस विषय पर कुछ पिछले प्रश्न हैं। कृपया एक नज़र डालें, और यदि कोई आपके प्रश्नों का उचित उत्तर देता है, तो इसे चिह्नित करने पर विचार करें। –