concurrency - Scala val has to be guarded with synchronized for concurrent access? -


जैसा मैंने पढ़ा है, स्काला अपरिवर्तनीय val जावा अंतिम < / कोड> विभिन्न कारणों के लिए क्या इसका मतलब यह है कि किसी अन्य थ्रेड से val तक पहुंचने से दृश्यता की गारंटी के लिए सिंक्रनाइज़ेशन से सुरक्षित होना चाहिए?

ऑब्जेक्ट के सदस्यों के रूप में, एक बार आरम्भ करने के बाद, val ऑब्जेक्ट के जीवनकाल के दौरान अपने मान कभी नहीं बदलता है जैसे, उनके मूल्यों को सभी धागे को दिखाई देने की गारंटी दी जाती है, बशर्ते ऑब्जेक्ट का संदर्भ निर्माता में नहीं बचा। और वास्तव में, वे जावा अंतिम संशोधक प्राप्त करते हैं जैसा कि नीचे सचित्र है:

  वस्तु obj {val r = 1 def foo {val a = 1 def bar = a bar }}   

javap का उपयोग करना:

  ... निजी फाइनल int r; ... सार्वजनिक शून्य foo (); ... 0: iconst_1 1: आस्टोरियस 2: अलॉडि 3: आईलोडि 4: अविष्कार # 31; // विधि बार $ 1: (आई) आई 7: पॉप ... निजी फाइनल इंट बार $ 1 (इंट); ... 0: आईएलओडी_1 1: आईआरटीन ...   

विधि स्थानीय लोगों के रूप में, वे केवल विधि के भीतर ही उपयोग किए जाते हैं, या उन्हें नेस्टेड पद्धति या तर्क के रूप में बंद कर दिया जाता है (ऊपर उठाया बार $ 1 ऊपर देखें)। एक समापन दूसरे धागे पर हो सकता है, लेकिन यह केवल स्थानीय val के मान के साथ एक अंतिम क्षेत्र होगा इसलिए, वे उस बिंदु से दिखाई दे रहे हैं जहां वे सभी अन्य थ्रेड्स के लिए बनाए जाते हैं और सिंक्रनाइज़ेशन आवश्यक नहीं है।

ध्यान दें कि यह वस्तु के बारे में कुछ नहीं कहता है कि val अंक - यह खुद को अस्थिर और वारंट सिंक्रनाइज़ेशन हो सकता है।

अधिकतर मामलों में उपरोक्त का प्रतिबिंब के माध्यम से उल्लंघन नहीं किया जा सकता - स्कला val सदस्य घोषणा वास्तव में एक ही नाम और एक निजी क्षेत्र जो प्राप्तकर्ता का उपयोग करता है फ़ील्ड को संशोधित करने के लिए प्रतिबिंब का उपयोग करने की कोशिश के परिणामस्वरूप NoSuchFieldException होगा आप इसे संशोधित करने का एकमात्र तरीका अपने वर्ग में एक विशेष टिप्पणी जोड़ना है, जो विशिष्ट क्षेत्रों को संरक्षित करेगा, इसलिए प्रतिबिंब के लिए उपयोग किया जा सकता है। मैं वर्तमान में किसी भी अन्य स्थिति के बारे में सोच नहीं सकता जो कि val ...

Comments