दिलचस्प पोस्ट
मानों के सेट के मानक विचलन (stddev) को मैं कैसे निर्धारित करूं? एक सर्वर प्रक्रिया के रूप में Excel फ़ाइलों को पढ़ना जावास्क्रिप्ट में एक गाया हुआ HTML पेज के हिस्से को कैसे मुद्रित कर सकता हूं? ऐप्पल कैसे जानता है कि आप निजी एपीआई का उपयोग कर रहे हैं? PHP में 'isset ()' और 'empty ()' के बीच अंतर क्या है? मेवेन स्कोप के बीच का अंतर संकलन और जेआर पैकेजिंग के लिए प्रदान किया गया है सशर्त ऑपरेटर निहित नहीं डाल सकते हैं? सेट अंतराल रोकें मूल्य द्वारा PHP बहुआयामी सरणी खोज नेविगेशन बार छिपाने से एक UISearchDisplayController को रोकें मैं पूरी तरह से HTTP अनुरोध कैसे देख सकता हूं जो कि मेरे पायथन एप्लिकेशन द्वारा भेजा जा रहा है? $ Location.path के साथ AngularJS पेजिंग लेकिन कोई ngView पुनः लोड नहीं क्या मैं गैर मौजूदा सीएसएस वर्गों का उपयोग कर सकता हूँ? लॉक फ़ाइल बनाने / खोलने में असमर्थ: /data/mongod.lock त्रुटि: 13 अनुमति अस्वीकृत UICollectionView एक सेल में छवि जोड़ने

जावा में वाष्पशील बनाम स्थिर

क्या यह कहना सही है कि स्थैतिक का मतलब है कि सभी वस्तुओं के लिए मूल्य की एक प्रति और स्थिरता सभी थ्रेड्स के लिए मूल्य की एक प्रति है?

वैसे भी एक स्थैतिक वैरिएबल वैल्यू भी सभी धागे के लिए एक मूल्य होने जा रहा है, फिर हमें अस्थिरता क्यों जाना चाहिए?

वेब के समाधान से एकत्रित समाधान "जावा में वाष्पशील बनाम स्थिर"

जावा में एक स्थिर वैरिएबल घोषित करने का मतलब है कि केवल एक ही प्रतिलिपि होगी, चाहे कक्षा कितने ऑब्जेक्ट बनाए जाएं। वेरिएबल यहां तक ​​पहुंचने में सक्षम नहीं होंगे। हालांकि, धागे में स्थानीय स्तर पर कैश्ड मूल्य हो सकते हैं।

जब एक चर अस्थिर है और स्थिर नहीं है, तो प्रत्येक Object लिए एक चर होगा। इसलिए, सतह पर ऐसा लगता है कि एक सामान्य चर से कोई अंतर नहीं है, लेकिन स्थैतिक से बिल्कुल अलग है। हालांकि, Object फ़ील्ड के साथ, एक थ्रेड स्थानीय रूप से एक वैरिएबल मान कैश कर सकता है।

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

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

हालांकि, वाष्पशील उचित सिंक्रनाइज़ेशन के लिए एक विकल्प नहीं है!
उदाहरण के लिए:

 private static volatile int counter = 0; private void concurrentMethodWrong() { counter = counter + 5; //do something counter = counter - 5; } 

concurrentMethodWrong विधि concurrentMethodWrong कई बार निष्पादित करने से शून्य से अलग काउंटर के अंतिम मान हो सकता है!
समस्या को हल करने के लिए, आपको लॉक लागू करना होगा:

 private static final Object counterLock = new Object(); private static volatile int counter = 0; private void concurrentMethodRight() { synchronized (counterLock) { counter = counter + 5; } //do something synchronized (counterLock) { counter = counter - 5; } } 

या AtomicInteger वर्ग का उपयोग करें।

स्थैतिक और वाष्पशील के बीच का अंतर:

स्थिर वैरिएबल : यदि दो धागे (मान लीजिए कि t1 और t1 ) उसी ऑब्जेक्ट तक पहुंच रहे हैं और एक वैरिएबल को अपडेट कर रहे हैं जिसे स्थिर घोषित किया जाता है तो इसका मतलब है कि t1 और t1 अपने स्वयं के स्थानीय प्रतिलिपि को उसी वस्तु (स्थैतिक चर सहित) में अपने संबंधित कर सकते हैं कैश, इसलिए t1 द्वारा अपने स्थानीय कैश में स्थिर वैरिएबल में अपडेट किया जा सकता है t1 कैश के लिए स्थिर चर में दर्शाता है।

स्थैतिक चर वस्तु के संदर्भ में उपयोग किया जाता है, जहां एक ऑब्जेक्ट द्वारा किए गए अपडेट उसी श्रेणी के अन्य सभी वस्तुओं में नज़र आएंगे, लेकिन थ्रेड के संदर्भ में नहीं होंगे, जहां स्थिर वेरिएबल के एक थ्रेड का अद्यतन परिवर्तन सभी को तत्काल प्रतिबिंबित करेगा धागे (उनके स्थानीय कैश में)

वाष्पशील वैरिएबल : यदि दो थ्रेड्स (लगता है कि t1 और t1 ) उसी ऑब्जेक्ट तक पहुंच रहे हैं और वैरिएबल को अपडेट कर रहे हैं जिसे वाष्पशील घोषित किया जाता है तो इसका मतलब है कि t1 और t1 ऑब्जेक्ट की अपनी स्थानीय कैश को वैरिएबल को छोड़ सकते हैं जिसे एक वाष्पशील । अतः वाष्पशील चर में केवल एक मुख्य कॉपी होती है जो अलग-अलग थ्रेडों द्वारा अद्यतन किया जाएगा और एक धागे द्वारा अस्थिर वैरिएबल में किए गए अद्यतन को अन्य धागा को तुरंत प्रतिबिंबित करेगा।

अन्य उत्तरों के अलावा, मैं इसके लिए एक छवि जोड़ना चाहूंगा (तस्वीर समझने में आसान बनाता है)

यहां छवि विवरण दर्ज करें

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

volatile घोषणा सुनिश्चित करता है कि थ्रेड्स डेटा को कैश नहीं करेगा और केवल साझा प्रति का उपयोग करता है

छवि स्रोत

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

आसान शब्दों में,

  1. स्थिर : static चर किसी भी ऑब्जेक्ट के बजाय वर्ग के साथ जुड़े हुए हैं क्लास का हर उदाहरण क्लास चर का हिस्सा होता है, जो मेमोरी में एक निश्चित स्थान में होता है

  2. अस्थिर : यह कीवर्ड क्लास और इंस्टेंस वैरिएबल दोनों के लिए लागू होता है।

वाष्पशील चर का उपयोग करना स्मृति स्थिरता त्रुटियों के जोखिम को कम करता है, क्योंकि किसी भी वाष्पशील परिवर्तनीय को लिखते समय ऐसा होता है-उस संबंध में इससे पहले कि उसी चर के बाद के पढ़ने के साथ संबंध। इसका अर्थ है कि एक अस्थिर चर में परिवर्तन हमेशा अन्य धागे को दिखाई देता है

एक बेहतर तरीके से अस्थिर चर को समझने के लिए Javin Paul द्वारा इस आलेख को देखें ।

यहां छवि विवरण दर्ज करें

volatile खोजशब्द की अनुपस्थिति में, प्रत्येक धागे के स्टैक में वैल्यू का वैल्यू अलग-अलग हो सकता है। वैरिएबल को volatile बनाकर, सभी थ्रेड्स को उनकी कामकाजी स्मृति में एक ही मान मिलेगा और स्मृति स्थिरता त्रुटियों से बचा जा रहा है।

यहां शब्द variable या तो static (कक्षा) चर या instance (वस्तु) चर हो सकता है

आपकी क्वेरी के बारे में:

वैसे भी एक स्थैतिक वैरिएबल वैल्यू भी सभी थ्रेडों के लिए एक मूल्य होने जा रहा है, फिर हमें वाष्पशील के लिए क्यों जाना चाहिए?

यदि मुझे अपने आवेदन में instance चर की आवश्यकता है, तो मैं static चर का उपयोग नहीं कर सकता static वैरिएबल के मामले में, आरेख में दिखाए गए अनुसार थ्रेड कैश के कारण स्थिरता की गारंटी नहीं है।

volatile चर का उपयोग करना स्मृति स्थिरता त्रुटियों के जोखिम को कम करता है, क्योंकि किसी भी वाष्पशील परिवर्तनीय को लिखते समय ऐसा होता है-उस संबंध में इससे पहले कि उसी चर के बाद के पढ़ने के साथ संबंध। इसका अर्थ है कि एक अस्थिर चर में परिवर्तन हमेशा अन्य धागे को दिखाई देता है।

क्या अधिक है, इसका भी अर्थ यह है कि जब कोई धागा एक अस्थिर चर को पढ़ता है, तो वह न केवल अस्थिरता में नवीनतम बदलाव देखता है, बल्कि उस कोड के साइड इफेक्ट को भी बदलता है जो कि परिवर्तन => स्मृति स्थिरता त्रुटियों का नेतृत्व करता है, अभी भी अस्थिर चर के साथ संभव है । साइड इफेक्ट से बचने के लिए, आपको सिंक्रनाइज़ किए गए चर का उपयोग करना होगा। लेकिन जावा में एक बेहतर समाधान है।

साधारण अणु परिवर्तनीय उपयोग का उपयोग सिंक्रनाइज़ किए गए कोड के माध्यम से इन चर तक पहुंचने के लिए अधिक कुशल है

java.util.concurrent पैकेज में कुछ क्लास परमाणु विधियों प्रदान करते हैं जो सिंक्रनाइज़ेशन पर भरोसा नहीं करते हैं।

अधिक विवरण के लिए इस उच्च स्तरीय संगामिति नियंत्रण लेख देखें।

विशेष रूप से परमाणु चर पर एक नज़र है

संबंधित एसई प्रश्न:

वाष्पशील बनाम परमाणु

वाष्पशील बूलियन बनाम परमाणु बुलियन

जावा में अस्थिर और सिंक्रनाइज़ के बीच अंतर

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

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

अगर किसी को स्थिर वैरिएबल से वांछित परिणाम की उम्मीद होती है तो बहु-थ्रेडिंग में स्थिर के साथ अस्थिरता का उपयोग करें, तब सबकुछ ठीक हो जाएगा।

अगर हम एक वैरिएबल को स्थैतिक घोषित करते हैं, तो चर की केवल एक प्रति होगी। इसलिए, जब भी भिन्न धागे उस वेरिएबल तक पहुँचते हैं, तो चर के लिए केवल एक अंतिम मूल्य होगा (क्योंकि चर के लिए केवल एक स्मृति स्थान आवंटित है)।

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

इसलिए, दोनों ही मामलों में, मुख्य बिंदु यह है कि वैरिएबल का मान सभी थ्रेडों में एक ही है।

एक चर अस्थिर गारंटी देता है कि विभिन्न आर्किटेक्चर पर jvm उस चर थ्रेड को स्थानीय रूप से कैश नहीं कर रहा है