2010-12-14 12 views
5

कुछ स्थितियां क्या हैं जहां आपको चिंता करने की आवश्यकता है कि एक स्थिर विधि धागा सुरक्षित है या नहीं?आपको थ्रेड सुरक्षा के बारे में चिंता करने की ज़रूरत है?

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

अग्रिम धन्यवाद।

उत्तर

6

यदि मेरे पास स्थैतिक उपयोगिता फ़ंक्शन है जो किसी भी स्थिर वर्ग स्तर चर को स्पर्श नहीं करता है, तो क्या यह विधि पहले से ही सुरक्षित है?

अधिकांश समय - यदि आपकी विधि reentrant है तो क्या मायने रखता है।

static int add(int a, int b) 
{ 
    return a + b; 
} 

अभी भी कुछ चीजों में से सावधान रहने की हैं: कुछ इस तरह रैत्रांत क्योंकि सब कुछ स्थानीय चर है और प्रत्येक धागा अपनी एक प्रतिलिपि प्राप्त करता है। यदि आप किसी ऑब्जेक्ट को विधि में पास करते हैं और विधि ऑब्जेक्ट को म्यूटेट करती है और विधि पूर्ण होने से पहले आप एक ही थ्रेड पर एक ही विधि को फिर से कॉल करते हैं लेकिन उसी ऑब्जेक्ट के साथ, तो आपको कोई समस्या है।

यदि मेरे पास स्थिर स्थैतिक वर्ग चर स्पर्श करता है, तो क्या यह विधि संभावित रूप से थ्रेड सुरक्षित नहीं है?

मुख्य समस्या फिर से है यदि चर परिवर्तनीय हैं। यदि आप केवल अपरिवर्तनीय वस्तुओं से पढ़ रहे हैं तो कोई समस्या नहीं हो सकती है।

यदि आप कोई विधि कॉल करते हैं और आप सुनिश्चित नहीं हैं कि यह पुनर्वित्तक है और दस्तावेज़ीकरण नहीं कहता है, तो यह मानना ​​सर्वोत्तम है कि यह नहीं है।

+0

ध्यान * एक साथ * पढ़ता/लिखना पर्याप्त नहीं है; अगर स्मृति को बाधा के आसपास सिंक्रनाइज़ नहीं किया गया है (जैसा कि जेएमएम द्वारा दस्तावेज किया गया है) एक या अन्य थ्रेड स्टेल मानों का निरीक्षण कर सकता है, और लिखित मान खो सकते हैं भले ही वे वास्तव में समय पर विवाद न करें। इसी कारण से यहां तक ​​कि केवल एक लेखक धागा परिदृश्य कुछ प्रकार की स्मृति बाधा अनुपस्थित है। –

3

जब भी आपके पास एक ही संसाधन तक पहुंचने वाले एक से अधिक धागे होते हैं तो आपको थ्रेड सुरक्षा के बारे में चिंता करने की ज़रूरत है।

आपकी स्थिर विधि असुरक्षित हो सकती है यदि यह अन्य धागे के रूप में समान संसाधनों का उपयोग कर रही है - सीधे या परोक्ष रूप से - भले ही वे संसाधन स्थैतिक वर्ग चर नहीं हैं।

+1

और डेटा साझा करने के लिए दो धागे के लिए स्थिर फ़ील्ड के अलावा अन्य तरीके हैं। विधि स्थिर शून्य MyClass.copy (से, से) विधि पर विचार करें। –

2

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

+0

हालांकि, यदि एक्सेस सिंक्रनाइज़ किया गया है, तो भी यह थ्रेड-सुरक्षित भी हो सकता है, भले ही उत्परिवर्तनीय संसाधनों का उपयोग किया जा सके। –

0

यदि थ्रेड सुरक्षा कम से कम एक एकल प्रविष्टि बिंदु है जिसे कई धागे द्वारा उपयोग किया जा सकता है तो चिंता का विषय बन जाता है।

यदि कोड का एक टुकड़ा एकाधिक धागे से उपयोग किया जाता है और अन्य विधि/वर्ग/आदि को कॉल कर रहा है, तो यह सब कोड पेड़ कमजोर हो जाता है।

"अभ्यास में जावा समरूपता" से: कार्य निष्पादन के आसपास एक कार्यक्रम आयोजित करने का पहला कदम समझदार कार्य सीमाओं की पहचान करना है। आदर्श रूप में, कार्य स्वतंत्र गतिविधियां हैं: कार्य जो नहीं है, अन्य कार्यों के राज्य, परिणाम या साइड इफेक्ट्स पर निर्भर करता है। स्वतंत्रता समेकन की सुविधा प्रदान करती है, क्योंकि अगर पर्याप्त संसाधन संसाधन हैं तो स्वतंत्र कार्यों को समानांतर में निष्पादित किया जा सकता है।

उदाहरण के लिए, यदि आप एक पृथक सर्वलेट लिख रहे हैं, जिसे एक थ्रेड द्वारा निष्पादित करने की गारंटी है, तो आपको चिंता करने की ज़रूरत नहीं है। लेकिन यदि आप एक स्थिर उपयोगिता लिखते हैं जिसका प्रयोग विभिन्न सर्लेट द्वारा किया जाता है, तो इसे बहु-थ्रेडेड एक्सेस को संभालने के लिए बनाया जाना चाहिए।

2

जब भी आपके पास एक ही संसाधन तक पहुंचने वाले एक से अधिक धागे होते हैं, तो आपको थ्रेड सुरक्षा के बारे में चिंता करने की ज़रूरत है, और वे संसाधन अपरिवर्तनीय नहीं हैं।

2

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

5

यदि आप स्थैतिक विधि में केवल स्थानीय स्टैक चर का उपयोग करते हैं तो चिंता करने का कोई कारण नहीं है। java.lang.Math.min (int, int) ऐसी विधि का अच्छा उदाहरण है। लेकिन अगर आप किसी भी साझा स्थिर चर, या ऑब्जेक्ट्स को स्पर्श करते हैं जिसमें राज्य (उर्फ अपरिवर्तनीय नहीं है) तो आपको सिंक्रनाइज़ेशन का उपयोग करना होगा।

+0

क्या आपका मतलब आपके पहले प्रेषण में 'चिंता करने का कोई कारण नहीं है'? –

+0

धन्यवाद टोनी। वह एक टाइपो था। –

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

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