2013-02-27 21 views

उत्तर

14

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

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

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

  • यह एक WeakReference जो पहले के लिए एक संदर्भ रखती है कनेक्शन ऑब्जेक्ट, और यह अभी भी अच्छा है। उस स्थिति में, कोड को बस इसका उपयोग शुरू करना चाहिए।

  • पहले कनेक्शन ऑब्जेक्ट का फ़ाइनलाइज़र पूरा होने के लिए चला गया है और दूरस्थ सर्वर नए कनेक्शन के लिए तैयार है। उस स्थिति में, कोड को बस एक नया कनेक्शन ऑब्जेक्ट बनाना चाहिए।

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

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

+0

बहुत बहुत धन्यवाद। बहुत बढ़िया जवाब। यह सप्ताह के आरंभ में एक और सवाल का जवाब भी देता है। मैंने स्टैक ओवरफ़्लो पर कुछ प्रश्न पूछे लेकिन यह उत्तर मुझे प्राप्त सर्वोत्तम या सर्वोत्तम में से एक है। बहुत बहुत धन्यवाद। –

+1

आपके काल्पनिक कनेक्शन प्रबंधक परिदृश्य में, मैं लंबे वीक रिफरेंस से कैसे कहूंगा कि ऑब्जेक्ट को अंतिम रूप देने के लिए निर्धारित किया गया है या नहीं (यानी मैं मामले # 3 के अलावा केस # 1 कैसे बता सकता हूं)? मेरे पास एक गैर-शून्य लक्ष्य के साथ एक वीक रेफरेंस ऑब्जेक्ट होगा, लेकिन मैं कैसे बता सकता हूं कि यह किस स्थिति में था? –

+2

@ माइकमैरीनोस्की: एक तरीका दो कमजोर संदर्भों का उपयोग करना होगा, एक लंबा और एक छोटा सा।यदि छोटा व्यक्ति मर गया है लेकिन लंबा अभी भी वैध है, तो ऑब्जेक्ट को अंतिम रूप देने के लिए निर्धारित किया गया है। – supercat

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