2012-07-18 25 views
18

मेरे पास चरणीय दायरे के बारे में एक प्रश्न है।स्थैतिक विधि और थ्रेड सुरक्षा में स्थानीय चर

उदाहरण के लिए:

class A { 
    private static void test() { 
     // do something with local variables 
    } 
} 

अब मैं दो धागे बनाने के लिए, और प्रत्येक थ्रेड के लिए A का एक उदाहरण बना सकते हैं।

  1. जब मैं प्रत्येक सूत्र में test() कहते हैं, मैं गारंटी ले सकते हैं कि test() धागा सुरक्षित है?

  2. test() में स्थानीय varibles कहाँ संग्रहीत हैं? प्रत्येक धागे का ढेर? हीप स्थान?

पीएस मुझे पता है कि स्थिर इस मामले में पूरी तरह से व्यर्थ है। मैंने इसे हमारे विरासत कोड में पाया; मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि मुझे क्या पता है!

उत्तर

28

प्रत्येक चर के अपने ढेर में स्थानीय चर संग्रहित होते हैं। इसका मतलब है कि स्थानीय चर कभी धागे के बीच साझा नहीं किया जाता है। इसका मतलब यह भी है कि सभी स्थानीय आदिम चर धागे सुरक्षित हैं।

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

ऑब्जेक्ट सदस्यों को ऑब्जेक्ट के साथ ढेर पर संग्रहीत किया जाता है। इसलिए, यदि दो धागे एक ही ऑब्जेक्ट उदाहरण पर एक विधि को कॉल करते हैं और यह विधि ऑब्जेक्ट सदस्यों को अद्यतन करती है, तो विधि थ्रेड सुरक्षित नहीं है।

थ्रेड सुरक्षा जांच: यदि एक संसाधन बनाया गया है, उसी थ्रेड के नियंत्रण में उपयोग और उपयोग किया जाता है, और इस धागे के नियंत्रण से बच नहीं जाता है, तो उस संसाधन का उपयोग थ्रेड सुरक्षित है।

से: http://tutorials.jenkov.com/java-concurrency/thread-safety.html

+2

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

+0

हां, इसी कारण से, संदर्भ को रद्द करके ऑब्जेक्ट का निपटान करना एक अच्छा विचार है। – Erol

+0

ग्रेट मैं इस सवाल से पूछने वाला था !!!! – JohnMerlino

0

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

संख्या 2 के लिए, स्थानीय चर प्रत्येक थ्रेड (या कम से कम अवधारणात्मक रूप से) के ढेर में हैं, इसलिए अन्य धागे द्वारा स्थानीय चर को संशोधित करने की कोई चिंता नहीं है।

2

जब मैं प्रत्येक थ्रेड में टेस्ट() को कॉल करता हूं, तो क्या मैं गारंटी दे सकता हूं कि टेस्ट सुरक्षित है?

हाँ यदि यह विधि स्थानीय चर पर काम कर रहा है, तो यह थ्रेड सुरक्षित होगा।

परीक्षण() में स्थानीय varibles कहाँ संग्रहीत हैं? प्रत्येक धागे का ढेर? हीप स्थान?

विधि स्थानीय चर प्रत्येक थ्रेड के अपने ढेर को संग्रहीत किया जाता है।