मैं मेरी कक्षा में निम्नलिखित है:अस्थिर परिवर्तनीय परमाणु संचालन पर सरल गेटर कॉल है?
private static volatile byte counter = 0;
public static byte getCounter() {return counter;}
getCounter
करने के लिए कॉल, परमाणु नहीं है या नहीं?
मैं मेरी कक्षा में निम्नलिखित है:अस्थिर परिवर्तनीय परमाणु संचालन पर सरल गेटर कॉल है?
private static volatile byte counter = 0;
public static byte getCounter() {return counter;}
getCounter
करने के लिए कॉल, परमाणु नहीं है या नहीं?
हां, यह एक परमाणु ऑपरेशन है, इस अर्थ में कि कोई पुनरावृत्ति या समय नहीं हो सकता है जिससे आंशिक रूप से लिखे जाने पर बाइट को पढ़ा जा सकेगा। यदि बाइट को फिर से सौंप दिया जाता है, जबकि इसे पढ़ा जा रहा है तो गेटर को या तो पहले या बाद के मूल्य को वापस करने की गारंटी है, लेकिन कोई अन्य मूल्य, यहां तक कि volatile
के बिना भी।
हालांकि, अगर आप चाहिएvolatile
एक डबल या लंबे मूल्य पर हो रही असंगत पढ़ता है कि न तो पुराने और न ही नया मान रहे हैं से बचने के लिए है:
जावा प्रोग्रामिंग भाषा स्मृति मॉडल के प्रयोजनों के लिए, एक गैर-अस्थिर लंबे या डबल मान को एक ही लिखना दो अलग-अलग लिखने के रूप में माना जाता है: प्रत्येक 32-बिट आधे में से एक। इसका परिणाम ऐसी परिस्थिति में हो सकता है जहां एक धागा 64-बिट मान के पहले 32 बिट्स को एक लिखने से देखता है, और दूसरा 32 बिट्स दूसरे लिखने से देखता है।
जावा वर्चुअल मशीन के कार्यान्वयन को 64-बिट मानों को विभाजित करने से बचने के लिए प्रोत्साहित किया जाता है। प्रोग्रामर को साझा 64-बिट मानों को
volatile
के रूप में घोषित करने या संभावित जटिलताओं से बचने के लिए अपने प्रोग्राम को सही तरीके से सिंक्रनाइज़ करने के लिए प्रोत्साहित किया जाता है।
स्रोत: JLS8 section 17.7
@ रीयलस्केप्टिक राइट, मैंने ओपी के पोस्ट में 'अस्थिर' कीवर्ड नहीं पकड़ा। – hexafraction
हां। अस्थिर उद्देश्य का उद्देश्य। यह देखने के लिए उत्सुक है कि मेरी समझ सही है या नहीं .... –
दरअसल, अस्थिरता का उद्देश्य यह सुनिश्चित करना है कि अस्थिर चर के लिए धागे द्वारा कोई भी लेखन अन्य धागे द्वारा बाद में पढ़ेगा। एक बाइट पढ़ना/असाइन करना अस्थिर या बिना अस्थिर है। –
कृपया ध्यान दें कि इस तर्क में 'long' और' double' –