software - java verify




जेडीके स्रोतकोड 'अस्थिर' उदाहरणों की 'अंतिम' प्रतिलिपि क्यों लेता है (2)

मैंने ConcurrentHashMap के बारे में जेडीके के स्रोत कोड को पढ़ा।

लेकिन निम्नलिखित कोड ने मुझे भ्रमित कर दिया:

public boolean isEmpty() {
    final Segment<K,V>[] segments = this.segments;
    ...
}

मेरा सवाल यह है कि:

"यह। सेगमेंट" घोषित किया गया है:

final Segment<K,V>[] segments;

तो, यहां, विधि की शुरुआत में, एक ही प्रकार का संदर्भ घोषित किया गया, उसी स्मृति को इंगित करें।

लेखक ने ऐसा क्यों लिखा? उन्होंने इसका उपयोग क्यों नहीं किया। सेगमेंट सीधे? क्या कोई कारण है?


मुझे लगता है कि यह प्रदर्शन विचार के लिए है, ताकि हमें केवल एक बार फ़ील्ड मान पुनर्प्राप्त करने की आवश्यकता हो।

आप यहोशू ब्लोच द्वारा प्रभावी जावा से सिंगलटन मुहावरे का उल्लेख कर सकते हैं

उनका सिंगलटन यहां है:

private volatile FieldType field;
FieldType getField() {
  FieldType result = field;
  if (result == null) { 
    synchronized(this) {
      result = field;
      if (result == null) 
        field = result = computeFieldValue();
    }
  }
  return result;
}

और उसने लिखा:

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


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

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

इस बाद के मामले में वास्तव में कुछ विवाद है, क्योंकि जेआईटी कंपाइलर आमतौर पर उन चिंताओं का ख्याल रखेगा, लेकिन डौग ली उन लोगों में से एक है जो सामान्य सिद्धांत पर इसके साथ चिपकते हैं।







java