क्या इसका मतलब यह है कि संदर्भ स्थापित करना एक परमाणु संचालन नहीं है?
संदर्भ चर सेट करना परमाणु है, लेकिन परमाणु ऑपरेशन आवश्यक रूप से थ्रेड-सुरक्षित नहीं है। मुझे समझाने दो।
परमाणु का अर्थ है कि कोई पर्यवेक्षक (थ्रेड) या तो पुराने मान या चर के नए मान को देखता है, और कुछ और नहीं। इसका मतलब यह नहीं है कि जब वे चर को देखते हैं तो सभी पर्यवेक्षकों को नया मान दिखाई देता है। (और जैसा कि @Tom इंगित करता है, संदर्भ चर की परमाणुता वस्तु के परमाणु गुणों के बारे में कुछ भी नहीं कहती है।)
सभी पर्यवेक्षकों के लिए चर में नए मान को देखने के लिए, कुछ सिंक्रनाइज़ेशन होने की आवश्यकता है पर। एक चर के लिए एक अद्यतन के लिए, यह होगा यदि:
- चर
volatile
के रूप में घोषित किया जाता है, या
- पहुँच/चर के लिए अद्यतन एक ही आदिम मॉनिटर ताला द्वारा सिंक्रनाइज़ किए जाते हैं।
एक चर ही आप आम तौर पर इन वर्गों में से एक का उपयोग करें यदि आप ताले से बचना चाहते हैं और आप इस तरह के परमाणु के रूप में काम करने के लिए चाहते हैं कि, प्रासंगिक "AtomicXxx" वर्ग भी धागा सुरक्षित हो जाएगा में लपेटा जाता है "की तुलना और बदलें"।
फिर भी, यह केवल ऑब्जेक्ट के संदर्भ की थ्रेड-सुरक्षा पर लागू होता है। यदि ऑब्जेक्ट की स्थिति भी ठीक से सिंक्रनाइज़ नहीं है, तो थ्रेड ऑब्जेक्ट के गुणों आदि के लिए बालों के मूल्यों को अच्छी तरह से देख सकता है।
स्रोत
2010-03-05 04:20:09
आपका उदाहरण पूरी तरह से थ्रेड-सुरक्षित नहीं है। यदि सूची असुरक्षित रूप से प्रकाशित की गई है तो आप सामग्री को सही ढंग से नहीं पढ़ सकते हैं (हालांकि 'लिंक्डलिस्ट' के कार्यान्वयन से आप इसे खाली होने की अनुमति दे सकते हैं)। –
@ टॉम: क्या आपका मतलब है कि अन्य धागे को कुछ लिस्ट फ़ील्ड के लिए पुराना, कैश किया गया मान मिल सकता है, या कुछ लिस्ट फ़ील्ड वास्तव में "अर्ध-लिखित" हो सकता है? – radai
@ hatchetman82 मेरा मतलब है कि नए संदर्भ को पढ़ने के बाद, जिस ऑब्जेक्ट को इंगित करता है वह पूरी तरह से अपडेट नहीं हो सकता है। तो अगर मैं असुरक्षित रूप से सार्वजनिक 'नया java.awt.Point (1, 2) 'था, तो मैं ऑब्जेक्ट को किसी अन्य थ्रेड में पढ़ने में सक्षम हो सकता हूं लेकिन' x' और 'y' फ़ील्ड अभी भी शून्य हो सकते हैं। –