2010-08-03 9 views
10

के अंदर परिवर्तनीय साझाकरण मेरे पास स्थिर विधि के अंदर चर के बारे में एक प्रश्न है। स्थिर विधि के अंदर चर समान स्मृति स्थान साझा करते हैं या उनके पास अलग-अलग स्मृति होगी?स्थिर विधि

यहां एक उदाहरण है।

public class XYZ 
{ 
    Public Static int A(int value) 
    { 
     int b = value; 
     return b; 
    } 
} 

तो 3 अलग उपयोगकर्ता कॉल एक ही समय में विधि पर अमल एक

XYZ.A(10); 
XYZ.A(20); 
XYZ.A(30); 

। प्रत्येक कॉल के वापसी मूल्य क्या होगा?

XYZ.A(10)=? 
XYZ.A(20)=? 
XYZ.A(30)=? 
+0

देखें: http://stackoverflow.com/questions/420895/how-do-i-now-if-a-c-method-is-thread-safe –

+0

क्या आप किसी भी थ्रेड का उपयोग कर रहे हैं? –

उत्तर

15

वे अभी भी स्थानीय चर हैं - वे धागे के बीच साझा नहीं हैं। तथ्य यह है कि वे एक स्थिर विधि के भीतर हैं कोई फर्क नहीं पड़ता।

आप मध्यवर्ती चर के रूप में एक स्थिर चर उपयोग किया है, असुरक्षित हो सकता है कि:

public class XYZ 
{ 
    // Don't do this! Horribly unsafe! 
    private static int b; 
    public static int A(int value) 
    { 
     b = value; 
     return b; 
    } 
} 

यहां सारे सूत्र वास्तव में, एक ही b चर का उपयोग करेंगे, इसलिए यदि आप कहा जाता है एक साथ कई धागे से विधि, थ्रेड एक्स b पर लिखा जा सकता है, उसके बाद थ्रेड वाई, ताकि थ्रेड एक्स थ्रेड वाई

4

धागे एक दूसरे के मूल्यों के ऊपर लिख नहीं होगा, के बाद से चर ढेर पर पूरी तरह से कर रहे हैं। प्रत्येक धागे में एक अलग ढेर होता है।

1

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

1

नहीं, वे स्मृति में समान स्थान साझा नहीं करते हैं। आपके कॉल के लिए, वे वापस आ जाएंगे, (आपके द्वारा सूचीबद्ध क्रम में): 10, 20, और 30

सच में, अपने कोड के साथ इस किसी भी मामले में सच हो सकता है (जब से तुम सिर्फ एक मान निर्दिष्ट कर रहे हैं, इसके साथ कुछ नहीं कर रहा है), लेकिन पर विचार करें:

Class XYZ 
{ 
    public static int A (int value) 
    { 
     b += value; \\Won't compile: b not initialized 
     return b; 
    } 
} 

या

Class XYZ 
{ 
    public static int A (int value) 
    { 
     int b = 0; \\Initialized 'b' for each call 
     b += value; 
     return b; 
    } 
} 

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

+0

बेशक, जब तक आपके पास स्थैतिक चर नहीं था। –

+0

सच है। उन्हें इतनी बार प्रयोग करें कि मैं उनके बारे में भूल गया ... इस विशिष्ट प्रश्न के लिए, यह किसी समस्या की तरह प्रतीत नहीं होता है। – AllenG

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