concurrency - Does a running thread in an object prevent it from being garbage collected in java? -


कोड को देखते हुए:

  नया थ्रेड (नया बैकग्राउंडवर्क ())। ;  

सहज रूप से यह महसूस होता है कि पृष्ठभूमि वर्कर के उदाहरण को जीसी से सुरक्षित होने तक थ्रेड के बाहर निकल जाना चाहिए, लेकिन क्या यह मामला है? और क्यों ?

संपादित करें:

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

पोस्ट किए गए उत्तर वाकई उत्कृष्ट हैं मैं सॉफ्टवेयर बंदर को हरा चेकबॉक्स देगा कृपया ध्यान दें कि डारॉन का उत्तर समान रूप से मान्य है, लेकिन सॉफ्टवेयर मॉकर ने समस्या को समझाया I था;

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


संपादित करें: क्योंकि डारॉन इस मौत को मार रहा है, और कुछ उनके तर्क से आश्वस्त हैं, मैं उनके आधार पर अपने स्पष्टीकरण पर विस्तार करने जा रहा हूं।

यह क्षण था कि थ्रेड को छोड़कर किसी के लिए यह कानूनी नहीं था। थान (।),

उस मामले में यह थ्रेड.रन के डिफ़ॉल्ट रूप से कार्यान्वयन के लिए कानूनी होगा:

  शून्य रन () {रनयनेबल टीएमपी = this.myRunnable; // मान लें कि जीआईटी ने इसे एक रजिस्टर चर बना दिया है This.myRunnable = नल; जीसी के लिए // रिलीज अगर (टीएमपी! = नल) {tmp.run (); // यदि tmp.run () के अंदर कोड रजिस्टर को ओवरराइट करता है, तो जीसी हो सकता है }}  

मैं तर्क करता हूं कि इस मामले में टीएमपी अभी भी धागा निष्पादन के द्वारा थ्रेड.रन () में चलने योग्य के संदर्भ में है और इसलिए जीसी के लिए योग्य नहीं है।

क्या होगा (कुछ अव्यवहारिक कारण के लिए) कोड ऐसा दिखता है:

  शून्य रन () {रनयनीय टीएमपी = यह.माइंडेबल; // मान लें कि जीआईटी ने इसे एक रजिस्टर चर बना दिया है This.myRunnable = नल; जीसी के लिए // रिलीज अगर (टीएमपी! = नल) {tmp.run (); // यदि tmp.run () के अंदर कोड रजिस्टर को ओवरराइट करता है, तो जीसी हो सकता है System.out.println ("निष्पादित रननबल:" + tmp.hashCode ()); }}  

स्पष्ट रूप से, tmp द्वारा संदर्भित उदाहरण GC'd नहीं हो सकता है, जबकि tmp.run () निष्पादित हो रहा है।

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

इसके अलावा, डारॉन यह मान सकता है कि जेआईटी कंपाइलर किसी भी बदलाव को पसंद करता है - संकलक नहीं < Em> को निष्पादन कोड के संदर्भ में परिवर्तित करने की अनुमति दी गई है। अगर मैं उस कोड को लिखता हूं जिसमें पहुंच योग्य संदर्भ होता है, तो कंपाइलर उस संदर्भ को दूर नहीं कर सकता और मेरे ऑब्जेक्ट को एकत्रित करने के लिए पैदा कर सकता है, जबकि यह संदर्भ क्षेत्र में है।

मुझे पता नहीं है कि पहुंच योग्य वस्तुओं कैसे हैं वास्तव में पाया; मैं सिर्फ तर्क का विस्तार कर रहा हूं जो मुझे लगता है कि उसे पकड़ना चाहिए। यदि मेरा तर्क सही नहीं था, तो किसी भी वस्तु को एक विधि के भीतर तत्क्षणीकृत किया जाता है और केवल उस विधि में एक स्थानीय चर में निर्दिष्ट जीसी के लिए तत्काल पात्र होगा - स्पष्ट रूप से ऐसा नहीं है और ऐसा नहीं हो सकता।

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


Comments