मैं डबल के बारे में जांच कर रहा है मुहावरा और ताला लगा मैं क्या समझ में आ से जाँच की है, अपने कोड एक आंशिक रूप से निर्माण उदाहरण पढ़ने की समस्या के लिए ले जा सकता है जब तक कि आपके टेस्ट वर्ग अपरिवर्तनीय है:
जावा मेमोरी मॉडल अपरिवर्तनीय वस्तुओं को साझा करने के लिए प्रारंभिक सुरक्षा की एक विशेष गारंटी प्रदान करता है।
ऑब्जेक्ट संदर्भ प्रकाशित करने के लिए सिंक्रनाइज़ेशन का उपयोग नहीं होने पर भी उन्हें सुरक्षित रूप से एक्सेस किया जा सकता है।
तो उस मामले में
(बहुत उचित पुस्तक अभ्यास में जावा संगामिति से कोटेशन), डबल ताला लगा मुहावरा काम करेगा जाँच की।
लेकिन, यदि ऐसा नहीं है, तो देखें कि आप सिंक्रनाइज़ेशन के बिना चर आवृत्ति को वापस कर रहे हैं, इसलिए आवृत्ति चर पूरी तरह से निर्मित नहीं हो सकता है (आप गुणों के बजाय गुणों के डिफ़ॉल्ट मान देखेंगे निर्माता)।
बूलियन वैरिएबल समस्या से बचने के लिए कुछ भी नहीं जोड़ता है, क्योंकि टेस्ट क्लास शुरू होने से पहले इसे सत्य पर सेट किया जा सकता है (सिंक्रनाइज़ किए गए कीवर्ड पूरी तरह से पुन: व्यवस्थित होने से नहीं बचते हैं, कुछ सेंकेंस ऑर्डर बदल सकते हैं)। इसकी गारंटी के लिए जावा मेमोरी मॉडल में नियम से पहले ऐसा नहीं होता है।
और बूलियन अस्थिर कुछ भी या तो जोड़ नहीं होगा बनाने, क्योंकि 32 बिट चर जावा में atomically बनाई गई हैं। डबल चेक लॉकिंग मुहावरे उनके साथ भी काम करेगा।
जावा 5 के बाद से, आप उस समस्या को अस्थिर रूप में उदाहरण चर घोषित ठीक कर सकते हैं।
आप this very interesting article में डबल जाँच मुहावरा के बारे में अधिक पढ़ सकते हैं।
अंत में, कुछ सिफारिशों मैं पढ़ा है:
पर विचार करें यदि आप सिंगलटन पैटर्न का उपयोग करना चाहिए। इसे कई लोगों द्वारा एक विरोधी पैटर्न माना जाता है। जहां संभव हो निर्भरता इंजेक्शन पसंद किया जाता है। this देखें।
सावधानी से विचार करें, तो डबल जाँच ताला लगा अनुकूलन कार्यान्वित करने से पहले वास्तव में आवश्यक है, क्योंकि ज्यादातर मामलों में, कि प्रयास के लायक नहीं होगा। साथ ही, स्थैतिक क्षेत्र में टेस्ट क्लास का निर्माण करने पर विचार करें, क्योंकि आलसी लोडिंग केवल तब उपयोगी होती है जब कक्षा बनाने में बहुत सारे संसाधन होते हैं और ज्यादातर बार, यह मामला नहीं है।
आप अभी भी इस अनुकूलन प्रदर्शन करने की जरूरत है, इस link जो आप क्या प्रयास कर रहे हैं करने के लिए एक समान प्रभाव प्राप्त करने के लिए कुछ विकल्प प्रदान करता है की जाँच करें।
मैं इसका उपयोग करता हूं। इसका कारण यह है कि प्रारंभिक = सत्य रेखा हिट होने से पहले पूरी तरह से तत्काल हो जाएगा और जावा में एक बूलियन मान असाइन करना एक परमाणु ऑपरेशन है (प्रत्येक चिपसेट पर मैंने कभी भी उपयोग किया है)। – Jono
@ जोनो यह कंपाइलर और वीएम पर निर्भर करता है, अगर यह काम करता है या नहीं। कंपाइलर एक बाइटकोड उत्पन्न कर सकता है जो '! प्रारंभिक 'अभिव्यक्ति का मान _caching_ है, और इस प्रकार गायब हो जाता है यदि कोई अन्य थ्रेड' प्रारंभिक 'संपत्ति के मान को बदलता है। यदि एक ही कोड समानांतर चलाया जाता है, तो उदाहरण प्रारंभिकता को दो बार निष्पादित किया जा सकता है। इसके अलावा, जेआईटी कंपाइलर इस अभिव्यक्ति को एक गैर-अनुकूलित बाइटकोड से अनुकूलित कर सकता है। बस सोचें: वीएम को एक ही अभिव्यक्ति का मूल्यांकन करना है, तुरंत दूसरे के बाद। एक 'डुप्ली' ऑपरेशन पुनः मूल्यांकन को रोकता है, और जेएलएस के अनुसार एक मान्य कोड परिवर्तन है। – gaborsch