2011-08-12 13 views
5

अन्य सभी परमाणु वस्तुओं के लिए समान है? एक परमाणु इंटेगर के लिए सवाल को समझना आसान है। चूंकि अधिक 1 धागा myInt के संदर्भ तक पहुंच रहा है, क्या यह संभव नहीं है कि एक थ्रेड पंजीकृत कैश किए गए मान को देखता है, उदाहरण के लिए शून्य, इस ऑब्जेक्ट के लिए, जब तक इसे अस्थिर घोषित नहीं किया जाता है? अगर नहीं आते हैं?क्या परमाणु संदर्भ को अस्थिर घोषित करना आवश्यक है?

+0

मैं सभी परमाणु संदर्भ फ़ील्ड को अंतिम बनाने की कोशिश करता हूं। आपको इसे बदलने की जरूरत से बचने चाहिए। –

उत्तर

8

न केवल यह आवश्यक है, यह वास्तव में अर्थात् गलत है। AtomicReference अपने भीतर "असली" संदर्भ रखता है, और इसकी अपनी सिंक्रनाइज़ेशन संरचनाओं का उपयोग करके इसका उपयोग करता है। JVM का स्वयं सिंक्रनाइज़ेशन संरचना (synchronized, volatile, आदि) और उपयोग नहीं किया गया है। AtomicReference ऑब्जेक्ट को खुद को अस्थिर नहीं माना जाना चाहिए। अगर कुछ भी है, तो इसे final बनाने पर विचार करें।

भी विचार this question - volatileAtomicReference का उपयोग कर, अगर आप सभी की जरूरत हो और संचालन सेट किया गया है के लिए एक विकल्प माना जा सकता है।

+0

क्यों नहीं? एक समवर्ती मानचित्र वैध कारण के लिए एक अस्थिर क्षेत्र द्वारा अच्छी तरह से पकड़ सकता है, और मुझे नहीं लगता कि यह "परमाणु" वस्तुओं के लिए क्यों सच नहीं होना चाहिए? –

+0

@ एनो: निश्चित रूप से, मुझे लगता है कि आप एक परिदृश्य को बना सकते हैं जहां यह उचित होगा। यदि आप कोड में 'अस्थिर परमाणु संदर्भ' देखना चाहते थे, हालांकि, यह निश्चित रूप से लेखक के इरादे से नहीं होगा। – skaffman

+0

@ स्काफमैन: निश्चित रूप से परमाणु संदर्भ में लक्ष्य वस्तु के वास्तविक संदर्भ हैं, लेकिन मैं इस परमाणु संदर्भ वस्तु के संदर्भ का जिक्र कर रहा हूं। लेकिन वास्तव में मैं इसे अंतिम बना सकता हूं, और यह भी सही समझ में आता है। धन्यवाद! –

1

"परमाणु" वस्तुएं अपरिवर्तनीय नहीं हैं, इसलिए यदि वे ठीक से प्रकाशित होते हैं तो उन्हें थ्रेड सुरक्षित होना चाहिए। उदाहरण के लिए, जब आप ऐसा कुछ करते हैं, तो आपको अस्थिर कीवर्ड का उपयोग करने की आवश्यकता होगी।

volatile AtomicInteger counter = // initialize counter 

int harvest(){ 
    AtomicInteger old = counter; 
    counter = new AtomicInteger(); 
    return old.get(); 
} 

आप ऊपर कोड से अस्थिर निकालते हैं, तो आप वास्तव में कुछ वेतन वृद्धि खो सकता है। Spec के अनुसार, आप एक परमाणु इंटेगर ऑब्जेक्ट का भी संदर्भ प्राप्त कर सकते हैं जो पूरी तरह से निर्मित नहीं है, और इस प्रकार अपरिभाषित व्यवहार प्राप्त करता है।

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

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