एक प्रमुख बिंदु जो अभी तक उल्लेख नहीं किया गया है, वह यह है कि किसी वस्तु की स्थिति परस्पर होने से उस वस्तु की पहचान संभव हो जाती है, जो उस स्थिति को अपरिवर्तनीय बनाती है।
कई कार्यक्रमों को वास्तविक दुनिया की चीजों को मॉडल करने के लिए डिज़ाइन किया गया है जो स्वाभाविक रूप से उत्परिवर्तनीय हैं। मान लीजिए कि 12:51 बजे, कुछ चर AllTrucks
ऑब्जेक्ट # 451 का संदर्भ रखता है, जो एक डेटा संरचना का मूल है, जो इंगित करता है कि उस क्षण में बेड़े के सभी ट्रकों में क्या कार्गो निहित है (12:51 am), और कुछ चर BobsTruck
एक वस्तु के लिए # 24601 अंक वस्तु का संदर्भ प्राप्त करने के लिए इस्तेमाल किया जा सकता है जो इंगित करता है कि बॉब के ट्रक में उस समय (12:51 बजे) क्या कार्गो निहित है। 12:52 बजे, कुछ ट्रक (बॉब सहित) लोड और अनलोड किए जाते हैं, और डेटा संरचनाएं अपडेट की जाती हैं, ताकि AllTrucks
अब एक डेटा संरचना का संदर्भ होगा जो इंगित करता है कि कार्गो सभी ट्रकों में 12:52 बजे तक है।
क्या होना चाहिए BobsTruck
?
यदि प्रत्येक ट्रक वस्तु की 'कार्गो' संपत्ति अपरिवर्तनीय है, तो ऑब्जेक्ट # 24601 हमेशा के लिए उस स्थिति का प्रतिनिधित्व करेगा जो बॉब का ट्रक 12:51 बजे था। यदि BobsTruck
ऑब्जेक्ट का सीधा संदर्भ # 24601 है, तो जब तक कि कोड जो अपडेट करने के लिए AllTrucks
भी अपडेट नहीं होता है BobsTruck
, वह बॉब के ट्रक की वर्तमान स्थिति का प्रतिनिधित्व करने के लिए बंद हो जाएगा। आगे ध्यान दें कि जब तक कि BobsTruck
उत्परिवर्तित वस्तु के किसी रूप में संग्रहित नहीं किया जाता है, केवल एक ही तरीका है कि जो कोड अद्यतन AllTrucks
कर सकता है वह अद्यतन करेगा यदि कोड स्पष्ट रूप से ऐसा करने के लिए प्रोग्राम किया गया था।
यदि कोई व्यक्ति BobsTruck
सभी वस्तुओं को अपरिवर्तनीय रखते हुए राज्य बॉब के ट्रक का निरीक्षण करने में सक्षम होना चाहता है , तो BobsTruck
वह एक अपरिवर्तनीय कार्य हो सकता है , जो AllTrucks
किसी विशेष समय पर होने वाले मूल्य को देखते हुए , बॉब के ट्रक की स्थिति का उत्पादन करेगा। उस समय। यहां तक कि यह अपरिवर्तनीय कार्यों की एक जोड़ी भी पकड़ सकता है - जिनमें से एक उपरोक्त के रूप में होगा, और जिनमें से दूसरा एक बेड़े राज्य और एक नए ट्रक राज्य के संदर्भ को स्वीकार करेगा, और एक नए बेड़े राज्य के लिए एक संदर्भ लौटाएगा जो पुराने से मेल खाता है, सिवाय इसके कि बॉब के ट्रक में नया राज्य होगा।
दुर्भाग्य से, इस तरह के एक समारोह का उपयोग करने के बाद हर बार कोई बॉब के ट्रक की स्थिति तक पहुंचना चाहता है, बल्कि कष्टप्रद और बोझिल हो सकता है। एक वैकल्पिक दृष्टिकोण यह कहना होगा कि ऑब्जेक्ट # 24601 हमेशा और हमेशा के लिए होगा (जब तक कोई भी इसका संदर्भ रखता है) बॉब के ट्रक की वर्तमान स्थिति का प्रतिनिधित्व करता है । कोड जो बॉब के ट्रक की वर्तमान स्थिति को बार-बार एक्सेस करना चाहेगा, उसे हर बार कुछ समय लेने वाला फ़ंक्शन नहीं चलाना होगा - यह केवल एक बार देखने का कार्य कर सकता है ताकि यह पता चल सके कि ऑब्जेक्ट # 24601 बॉब का ट्रक है, और फिर बस उस वस्तु तक किसी भी समय पहुंच यह बॉब के ट्रक की वर्तमान स्थिति को देखना चाहता है।
ध्यान दें कि कार्यात्मक दृष्टिकोण एकल-थ्रेडेड वातावरण में, या बहु-थ्रेडेड वातावरण में फायदे के बिना नहीं है जहां थ्रेड्स केवल इसे बदलने के बजाय डेटा का अवलोकन करेंगे। कोई भी ऑब्जर्वर थ्रेड, जिसमें निहित ऑब्जेक्ट रेफरेंस को कॉपी करता हैAllTrucks
और उसके बाद प्रतिनिधित्व किए गए ट्रक राज्यों की जांच करता है जिससे सभी ट्रकों की स्थिति उस समय दिखाई देगी जब उसने संदर्भ को पकड़ लिया। किसी भी समय एक पर्यवेक्षक धागा नए डेटा को देखना चाहता है, यह केवल संदर्भ को फिर से पकड़ सकता है। दूसरी ओर, एक एकल अपरिवर्तनीय वस्तु द्वारा दर्शाए गए बेड़े के पूरे राज्य का होना, दो थ्रेड्स को अलग-अलग ट्रकों को एक साथ अपडेट करने की संभावना को रोक देगा, क्योंकि प्रत्येक थ्रेड यदि अपने स्वयं के उपकरणों पर छोड़ दिया जाता है तो एक नया "बेड़े राज्य" ऑब्जेक्ट का उत्पादन होगा जिसमें शामिल था अपने ट्रक के नए राज्य और हर दूसरे के पुराने राज्य। सुधार का आश्वासन दिया जा सकता है यदि प्रत्येक थ्रेड केवल CompareExchange
अद्यतन करने के लिए उपयोग करता है AllTrucks
यदि यह परिवर्तित नहीं हुआ है, और विफल होने पर प्रतिक्रिया करता हैCompareExchange
अपनी राज्य वस्तु को पुनर्जीवित करने और ऑपरेशन को फिर से शुरू करने से, लेकिन अगर एक से अधिक थ्रेड एक साथ लिखने के ऑपरेशन का प्रयास करते हैं, तो प्रदर्शन आम तौर पर इससे भी बदतर होगा यदि सभी लेखन एक ही धागे पर किए गए थे; अधिक थ्रेड्स एक साथ संचालन का प्रयास करते हैं, जितना खराब प्रदर्शन होगा।
यदि अलग-अलग ट्रक ऑब्जेक्ट परस्पर भिन्न हैं , लेकिन अपरिवर्तनीय पहचान हैं , तो बहु-थ्रेडेड परिदृश्य क्लीनर बन जाता है। किसी भी ट्रक पर एक समय में केवल एक ही धागे को चलाने की अनुमति दी जा सकती है, लेकिन विभिन्न ट्रकों पर चलने वाले धागे बिना किसी हस्तक्षेप के ऐसा कर सकते हैं। हालांकि ऐसे तरीके हैं जो अपरिवर्तनीय वस्तुओं का उपयोग करते समय भी इस तरह के व्यवहार का अनुकरण कर सकते हैं (जैसे कोई "AllTrucks" ऑब्जेक्ट्स को परिभाषित कर सकता है ताकि XXX से SSS तक ट्रक की स्थिति को स्थापित करने के लिए बस एक वस्तु उत्पन्न करने की आवश्यकता होगी जो कहा "जैसा कि [समय], आदि [XXX] से संबंधित ट्रक का राज्य अब [SSS] है, बाकी सब चीज़ों की स्थिति [AllTrucks का पुराना मूल्य है] "। ऐसी वस्तु उत्पन्न करना इतना तेज़ होगा कि विवाद की उपस्थिति में भी, एCompareExchange
पाश लंबे समय तक नहीं लगेगा। दूसरी ओर, इस तरह के डेटा संरचना का उपयोग करने से किसी विशेष व्यक्ति के ट्रक को खोजने के लिए आवश्यक समय की मात्रा में वृद्धि होगी। अपरिवर्तनीय पहचान वाली परिवर्तनशील वस्तुओं का उपयोग करने से उस समस्या से बचा जाता है।