2012-03-26 10 views
7

पुस्तक "अभ्यास में जावा संगामिति" पृष्ठ 26 से:कैसे समझें "वेरिएबल कीवर्ड का उपयोग करते समय परिवर्तक अन्य राज्य चर के साथ इनवेरिएंट में भाग नहीं लेता है"?

आप अस्थिर चर केवल जब सभी निम्नलिखित मानदंडों को पूरा किया जाता है का उपयोग कर सकते हैं:

  • चर करने के लिए लिखता है अपने वर्तमान मूल्य पर निर्भर नहीं है , या आप सुनिश्चित कर सकते हैं कि केवल एक ही धागा कभी मूल्य अपडेट हो जाता है;

  • विविधताएं अन्य राज्य चर के साथ इनवेंचर्स में भाग नहीं लेती हैं; और

  • किसी भी अन्य कारण के लिए लॉकिंग की आवश्यकता नहीं है जबकि चर का उपयोग किया जा रहा है।

कैसे को समझने के लिए "चर जब अस्थिर कीवर्ड का उपयोग अन्य राज्य चर के साथ अपरिवर्तनशीलताओं में भाग नहीं लेता?"

+0

कुछ और संदर्भ उपयोगी होंगे, अन्यथा मैं अनुमान लगाऊंगा कि इसका क्या अर्थ हो सकता है। –

+0

क्षमा करें, मैंने अब संदर्भ जोड़ा है –

+0

मेरी पुस्तक में यह 39 पृष्ठ – gstackoverflow

उत्तर

15

"invariant" की एक साधारण परिभाषा: ऐसी स्थिति जो किसी ऑब्जेक्ट के जीवनकाल के दौरान हमेशा सत्य होती है।

Volatile variables do not share the atomicity features of synchronized blocks.

यही कारण है कि आप उन वर्गों के भीतर उनका उपयोग नहीं कर सकते हैं जिनमें कई चर शामिल हैं।

उदाहरण के लिए कल्पना करें कि आपके पास class है जो दो चर द्वारा वर्णित समय अंतराल का मॉडल करने के लिए है: start और end। एक परिवर्तनीय स्थिति यह हो सकती है कि startend से हमेशा कम या बराबर है। यदि दोनों चर (उदाहरण के रूप में) को अस्थिर घोषित किया जाता है तो आप volatile की दृश्यता सुविधाओं पर भरोसा कर सकते हैं, लेकिन आप यह सुनिश्चित नहीं कर सकते कि परिवर्तन के दौरान दोनों चर शामिल हैं, हमेशा परिवर्तनीय संतुष्ट होता है। सोचें:

public void setInterval(Date newStart, Date newEnd) 
{ 
// Check if inputs are correct 

// Here the object state is valid 
start = newStart; 

// If another thread accesses this object now it will 
// see an invalid state because start could be greater than end 

end = newEnd; 
// Here the object state is valid again 
} 

इस मामले में आप यह सुनिश्चित करें कि परिवर्तन हर धागा करने के लिए लेकिन दो निर्देश के बीच में वस्तु स्थिति मान्य नहीं हो सकता है दिख रहा है हो सकता है। क्योंकि इसे अन्य धागे से एक्सेस किया जा सकता है (याद रखें यह एक साधारण मामला है, इसलिए यह संभव है लेकिन संभव नहीं है) तो invariant condition "< अंत" शुरू हो सकता है।

यही कारण है कि अस्थिरता का उपयोग किसी भी तरह से परिभाषित पैटर्न के एक (छोटे) सेट के बाहर निराश होता है। एक अस्थिर चर का उपयोग केवल तभी किया जाना चाहिए जब ये शर्तें संतुष्ट हों:

  • परिवर्तनीय अन्य चर से संबंधित आविष्कारों में शामिल नहीं है (ऊपर वर्णित कारण के लिए)।
  • चर पर लिखने का मूल्य अपने वर्तमान मान पर निर्भर नहीं है।

    int temp = i; 
    i = i + 1; 
    int a = temp; 
    

    यह परमाणु बनाने के लिए: - सख्ती से बोला - धागे की सुरक्षित है क्योंकि यह कुछ इस तरह से फिर से लिखा हो जाएगा

उदाहरण के लिए अभिव्यक्ति int a = i++; यह नहीं है तो परमाणु नहीं है देखने के एक धागा बिंदु से आप इस तरह एक वर्ग कल्पना कर सकते हैं:

public class MyAtomicInteger 
{ 
    public synchronized increment() 
    { 
    x = x + 1; 
    } 

    private int x; 
} 
बेशक

यह एक सच्चे impleme मौजूद है AtomicInteger का ntation और यह पैकेज java.util.concurrent.atomic का हिस्सा है, यह लॉक-फ्री समवर्ती प्रोग्रामिंग के लिए कुछ सरल बुनियादी दिनचर्या प्रदान करता है।

+0

एक त्रुटि है: यह 'i = i + 1' नहीं बल्कि' i = temp + 1' आपके 'i' वृद्धि नमूने में है, अन्यथा 'i = i + 1' के बाद अनंत प्रतिस्थापन 'i ++' ऑपरेशन के समान है। बढ़ने से पहले – Mik378

+0

@ मिक 378 "i == temp" तो "i = i + 1" "i = temp + 1" के बराबर है। इस प्रकार "++" का विस्तार नहीं किया गया है "+" फिर "i + 1" को फिर से विस्तारित नहीं किया जाएगा –

+0

समझा, धन्यवाद। – Mik378