2012-11-22 26 views
5

आप नीचे एक जावा वर्ग में एक स्थिर चर counter देख सकते हैं।जावा स्थिर चर अपडेट

सवाल यह है कि यह चर रीसेट कब होगा? उदाहरण के लिए, जब मैं प्रोग्राम को पुनरारंभ करता हूं, कंप्यूटर। अन्य संभावित परिदृश्य क्या रीसेट कर सकते हैं?

एक और सवाल यह है: क्या इस चर के लिए कारणों समय की संख्या समारोह कर की तुलना में कम से बढ़ाने के लिए हो सकता है() निष्पादित किया जाता है? उदाहरण के लिए, क्या यह कक्षा java Whatever की कई प्रक्रियाओं को शुरू करने के साथ कुछ हो सकता है? या यह कई धागे/सर्वर, आदि के साथ कुछ हो सकता है?

class Whatever { 

    static int counter = 0; 

    function do() { 
     counter++; 
     //... 
    } 

} 

अतिरिक्त प्रश्न: एक से अधिक थ्रेड समारोह करना() पर अमल करते हैं, तो कैसे काउंटर चर व्यवहार करेंगे? यह कार्य करने की संख्या() को निष्पादित करने की संख्या से कम होगा?

+0

'स्थैतिक' चर प्रोग्राम के निष्पादन की शुरुआत में केवल एक बार शुरू किया जाता है। – Maroun

+0

आपका 'काउंटर' पैकेज निजी है, इसलिए उसी पैकेज में कोई भी वर्ग मनमाने ढंग से मूल्य असाइन कर सकती है। – jlordo

+0

बीटीडब्ल्यू, 'do' एक आरक्षित कीवर्ड है और * विधि विधि के रूप में उपयोग नहीं किया जा सकता है। – jlordo

उत्तर

2

एक स्थिर चर फिर से प्रारंभ किया जाएगा जब आप अनुप्रयोग पुनः आरंभ।

2

JLS के अनुसार:

एक क्षेत्र स्थिर घोषित किया जाता है, तो वहाँ मैदान के ठीक एक अवतार कोई फर्क नहीं पड़ता कि कितने वर्ग के उदाहरण (संभवतः शून्य) अंत में बनाया जा सकता है मौजूद है। एक स्थैतिक क्षेत्र, जिसे कभी-कभी कक्षा चर कहा जाता है, कक्षा को प्रारंभ होने पर अवतारित किया जाता है

तो यह आपके पहले प्रश्न का उत्तर देता है। i.e.e वर्ग लोड वास्तव में जब है :)

प्रति सेकंड प्रश्न के रूप में, नहीं। यदि परिवर्तनीय निजी घोषित किया गया है। फिर encapsulation की वजह से विधि के माध्यम से एकमात्र पहुंच है।

स्थैतिक चर तक रहता है जब तक JVM बंद है।

0

1) चर सेट किया गया है (रीसेट) जब वर्ग भरी हुई है। JVM को बंद करने के अलावा, कुछ सर्वर कक्षा को विभिन्न अनुप्रयोगों में लोड करते हैं (v.g., टॉमकैट वेबएप) और उनमें से कुछ उन्हें पुनरारंभ करने की अनुमति देते हैं।

2) धागे द्वारा समवर्ती संशोधन। लेकिन यह दुर्लभ होना चाहिए, जब तक आप इसका बहुत उपयोग नहीं करते। फ़ंक्शन/ब्लॉक के लिए synchronized का उपयोग करें।

+0

यदि एकाधिक धागे इसे एक्सेस करते हैं, काउंटर वेरिएबल बाहवे कैसे होगा? यह कार्य करने की संख्या() को निष्पादित करने की संख्या से कम होगा? – jQguru

+0

हां। 'काउंटर' होने के बारे में सोचें 2; 'thread1' ऑपरेशन करता है, ++ की गणना करने के लिए 2 को पुनः प्राप्त करता है और 3 जोड़ता है, लेकिन 2' थ्रेड 2 'के साथ 2 को बदलने से पहले ऑपरेशन शुरू होता है, यह पता चलता है कि' काउंटर' अभी भी 2 है, और परिणाम को 3 के रूप में गणना करता है। अंत दोनों धागे 'काउंटर' के मान को 3 तक सेट करेंगे, जबकि उनमें से एक को इसे 4 पर सेट करना चाहिए था। इसे कंसुरेंसी या रन हालत कहा जाता है। – SJuan76

1

counter एक निजी चर नहीं है। तो यह संभव है कि यह मूल्य किसी अन्य वर्ग द्वारा बदला जाता है।

जब भी आपका प्रोग्राम (या विशेष रूप से कंटेनर/जेवीएम) बहाल हो जाता है तो यह चर रीसेट हो जाएगा।

0

प्रश्न यह चर रीसेट कब होगा?

स्थैतिक चर कस्टम reset() विधि का उपयोग कर रीसेट किया जा सकता है। यदि आप प्रोग्राम को पुनरारंभ करते हैं, तो सैद्धांतिक रूप से उस चर को इसके मान में प्रारंभ किया जाएगा, जैसा कि यह समान नहीं है (आप प्रोग्राम को पुनरारंभ करते हैं)।

0
class Foo { // in same package 
public static void main(String[] args) { 
    Whatever w = new Whatever(); 
    for (int i = 0; i < 1000; i++) { 
     w.do(); 
    } 
    Whatever.counter = -1; 
} 
यहाँ do()

1000 बार शुरू हो जाती है, लेकिन counter अंत में मूल्य होगा।

मैंने आपके उदाहरण में do() का उपयोग किया था, लेकिन ध्यान दें कि मान्य विधि नाम नहीं है, क्योंकि यह लूप के दौरान एक करने के लिए कीवर्ड है।

0

एक स्थैतिक चर का अर्थ है कि प्रोग्राम निष्पादन के दौरान उस क्षेत्र का केवल एक अवतार होता है। कक्षा शुरू होने पर इसे लोड किया जाता है।

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

अपने ही आवश्यकता चर और कोड आप सिंक्रनाइज़ उपयोग कर सकते हैं कि की निर्भर नहीं होगा के बाकी (एक तोप के साथ एक मक्खी की हत्या) में हेरफेर करने के लिए है, तो या AtomicInteger (बेहतर प्रदर्शन के साथ विकल्प):

static synchronize int counter = 0; 
// or 
static AtomicInteger counter = new AtomicInteger(); 

यदि आपका कोड के बाकी अपने काउंटर की निर्भर है, आप एक ताला वस्तु का उपयोग करने या अपने विधि सिंक्रनाइज़ करना होगा:

class Whatever { 

    static int counter = 0; 

    synchronize function do() { 
     counter++; 
     if(counter < 10){ 
      // do something 
     } 
    } 
} 

// or 

class Whatever { 

    static int counter = 0; 
    static final Object _lock = new Object(); 

    function do() { 
     synchronized (_lock) { 
      counter++; 
      if(counter < 10){ 
       // do something 
      } 
     } 
    } 
} 

इस सेशन हैं मेरे सिर में अभी टियां हैं, लेकिन शायद और भी हैं।