2011-03-09 21 views
6

मैं अपना कस्टम क्लासलोडर लिख रहा हूं, और मुझे आश्चर्य है कि क्या मुझे इसे थ्रेड-सुरक्षित बनाना चाहिए? जैसा कि आप आसानी से देख सकते हैं, सभी मूल जावा क्लासलोडर थ्रेड-सुरक्षित नहीं हैं, केवल sun.misc.Launcher.AppClassLoader करता है (और फिर भी, मैंने ओपनजेडीके स्रोतों की जांच की है, और ओपनजेडीके में यह नहीं है)।क्या क्लासलोडर थ्रेड-सुरक्षित होना चाहिए?

क्या कोई कारण जावा क्लासलोडर सिंक्रनाइज़ नहीं हैं? कस्टम क्लासलोडर थ्रेड-सुरक्षित होना चाहिए?

+3

बताएं कि कौन सा क्लासलोडर थ्रेडसेफ नहीं है (और हाँ क्लासलोडर थ्रेडसेफ होना चाहिए) – bestsss

+2

सिंक्रनाइज़ किए गए उपयोग से कुछ थ्रेड सुरक्षित नहीं होता है। यह देखते हुए कि कितने अलग जेवीएम एक ही क्लासलोडर के साथ कई थ्रेड से कक्षाएं लोड करते हैं, मैं कहूंगा कि यह निश्चित रूप से थ्रेडसेफ होने के लिए अच्छी तरह से प्रदर्शित किया गया है। थ्रेडसाफ्टी कैसे पूरा हो सकता है, वैसे भी आप उम्मीद नहीं कर सकते हैं। – Yishai

उत्तर

2

ClassLoader.loadClass() सिंक्रनाइज़ किया गया है।

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

+0

वास्तव में एक वेबएप क्लासलोडर को लागू करने के लिए, लोड क्लास अतिरंजित होना चाहिए। वास्तव में सिंक विधि यह है: 'निजी सिंक्रनाइज़ क्लास लोड क्लास इंटरनेशनल (स्ट्रिंग नाम) 'जो वर्षों के लिए प्रमुख पकड़ था (है?): Http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4670071 – bestsss

+0

चूंकि मैं मैं कॉलकल्स को कॉल कर रहा हूं-> लोडक्लास श्रृंखला सीधे, मुझे लगता है, इसे उसी ऑब्जेक्ट पर loadClassInternal के रूप में सिंक्रनाइज़ किया जाना चाहिए। मुझे अभी पता नहीं है कि loadClassInternal कॉल –

+0

क्षमा करें, बस पुनः जांच करें, findClass * IS * सिंक्रनाइज़ किया गया है, इसलिए जब तक मैं केवल findClass को ओवरराइड कर रहा हूं, कोई भ्रम नहीं है। धन्यवाद! –

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