2012-11-06 15 views
5

यदि आप किसी सर्वर वातावरण में तैनाती नहीं कर रहे हैं, तो भी आपको थ्रेड लोकल पर निकालना होगा, भले ही ऐप कैश किए गए थ्रेड पूल का उपयोग करता हो?थ्रेड स्थानीय निकालने विधि

public static ThreadLocal<Integer> i = new ThreadLocal<Integer>(){{ 
    public Integer initialValue(){return 3;} 
}; 

उत्तर

2

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

तो हाँ, एक अर्थ में, सर्वर वातावरण के बारे में कुछ खास नहीं है। हालांकि, आम तौर पर जहां आप विकास के दौरान कोड को दोबारा लोड कर रहे हैं तो वहां अक्सर यह मामला होता है कि ThreadLocal मूल्य से पहुंच योग्य है (मूल्य-वर्ग-मूल्य-वर्ग-वर्ग-वर्ग के लिए सभी वर्गों के लिए मूल्य- कभी-लोड-थ्रू-क्लास-लोडर स्थिर-फ़ील्ड-ऑफ-क्लास को ThreadLocal पर)। जावा बीन्स और जेडीबीसी के कार्यान्वयन में समान समस्याएं हो सकती हैं।

5

javadoc for ThreadLocal के अनुसार:

... के बाद एक धागा दूर चला जाता है, धागे की स्थानीय उदाहरणों के अपने प्रतियां के सभी कचरा संग्रहण के अधीन हैं ...

यदि थ्रेड अभी भी आसपास हो सकता है, और आप संसाधन को संदर्भित करना चाहते हैं, तो remove() पर बेहतर कॉल करें।


लगता है जैसे आप इसे साफ़ करना चाहते हैं तो एक साधारण स्थानीय चर का उपयोग करने पर विचार करना चाहेंगे।

+0

यदि आपके पास कैश किए गए थ्रेड पूल हैं, तो धागे दूर जा सकते हैं या नहीं जा सकते हैं। –

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