2011-03-18 14 views
6

java.lang.reflect.Method धागा सुरक्षित है?क्या java.lang.reflect.Method धागा सुरक्षित है?

मेरे कार्यक्रम के प्रोफाइलिंग परिणाम से पता चला कि Class.getMethod() ने कई बार बुलाए जाने पर काफी कंप्यूटिंग समय लिया, मुझे उम्मीद से थोड़ा अधिक। मैं इसे एक बार कॉल कर सकता हूं और परिणामी विधि को कहीं आसानी से एक्सेस कर सकता हूं। लेकिन फिर, कई वेब वर्कर थ्रेड संग्रहीत Method ऑब्जेक्ट का एक साथ उपयोग करेंगे।

क्या यह सुरक्षित है?

उत्तर

5

विधि एकाधिक थ्रेडों में उपयोग करने के लिए सुरक्षित है बशर्ते आप इसे एकाधिक में उपलब्ध कराने के बाद विधि का राज्य नहीं बदलते threads.eg आप सेट थ्रेसेबल (सत्य) और सेट असफल (झूठी) को दो थ्रेड में कॉल कर सकते हैं और परिणाम थ्रेड सुरक्षित नहीं होगा। हालांकि इसका कोई अच्छा उपयोग नहीं है।

संक्षेप में, Method.setAccessible() तकनीकी रूप से थ्रेड सुरक्षित नहीं है, लेकिन आप इसे थ्रेड सुरक्षित तरीके से उपयोग करने में सक्षम होना चाहिए।

+0

वैसे, 'सेट असफल' सुरक्षा रिसाव नहीं है? अगर कुछ कोड को कुछ सुलभ करने का अधिकार है, तो बाद में एक और कोड आ सकता है और बिना किसी सुरक्षा जांच के निजी विधि का उपयोग कर सकता है। –

+0

जब तक आपका सुरक्षा प्रबंधक इसे रोकता है, आप सुरक्षित, पैकेज स्थानीय और निजी विधियों तक पहुंच सकते हैं। यह चेक ओवरराइड करके सार्वजनिक तरीकों के पहुंच प्रदर्शन में सुधार करता है। –

+0

हां, मैं सुरक्षा प्रबंधक के साथ एक मामले के बारे में बात कर रहा हूं ... और कोड के विभिन्न हिस्सों के लिए अलग-अलग विशेषाधिकार। लेकिन इसके लिए एक असंबंधित प्रश्न पर टिप्पणी का उपयोग करने के बजाय मैं इसके बारे में एक और सवाल खोलूंगा। –

4

जावा क्लास प्रति कक्षा लोडर उदाहरण के लिए केवल एक बार परिभाषित होने की गारंटी है, ताकि आप सुरक्षित रूप से मान सकें कि विधियों और उनके हस्ताक्षर समेत परिभाषा समय के माध्यम से नहीं बदलेगी, ताकि आप सुरक्षित रूप से कई धागे द्वारा उपयोग के लिए "कैश" कर सकें ।

हालांकि, ध्यान रखें कि एक ही पूर्ण योग्य नाम (पैकेज + क्लास नाम) वाले वर्ग अलग-अलग क्लासलोडर उदाहरणों द्वारा अलग-अलग परिभाषित किए जा सकते हैं।

0

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

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