Application
पुरानी एएसपी तकनीक से एक डेटास्टोर शेष है। इसमें एक वैश्विक लॉक है। जब आप Application.Lock()
पर कॉल करते हैं तो सभी थ्रेड में एप्लिकेशन ऑब्जेक्ट तक पहुंच सभी अवरुद्ध होती है।
दूसरी तरफ Cache
ऑब्जेक्ट जो एएसपी.NET के साथ पेश किया गया था, आपको अपने लॉकिंग सेमेन्टिक्स का उपयोग करने की अनुमति देता है। आप अपने वेब एप्लिकेशन को यथासंभव समानांतर रखते हुए कैश ऑब्जेक्ट में थ्रेड-सुरक्षित पहुंच सुनिश्चित करने के लिए .NET के lock
कथन का उपयोग कर सकते हैं। lock
कथन अधिक सुरक्षित है क्योंकि जब आप lock
ब्लॉक से बाहर निकलते हैं तो लॉक को रिलीज़ होने की गारंटी दी जाती है। एप्लिकेशन ऑब्जेक्ट इसकी गारंटी नहीं देता है। कैश ऑटो-एक्सपेयर मैकेनिज्म भी प्रदान करता है जो कैश के लिए बहुत उपयुक्त है। यह निर्भरता अनुबंधों और वैकल्पिक प्राथमिकताओं के आधार पर कुंजी को भी समाप्त कर सकता है, जिसमें निश्चित रूप से एप्लिकेशन ऑब्जेक्ट की कमी है।
मुझे Cache
ऑब्जेक्ट का उपयोग करने का कोई कारण नहीं दिखता है।
उदाहरण: मान लें कि आपके पास कैश में सौ आइटम हैं और आपके पास एक ही आइटम है जिसे आप कैश में स्टोर करना चाहते हैं यदि यह पहले से मौजूद नहीं है। इस परिदृश्य सभी आवेदन वस्तु को पहुँचता ब्लॉक किए गए हैं, भले ही वे पूरी तरह से अप्रासंगिक हैं
if(Application["someData"] == null)
{
Application.Lock();
if(Application["someData"] == null)
{
Application["someData"] = getValue(); //a very long time consuming function
}
Application.Unlock();
}
: जब आप Application
उपयोग करते हैं, आप यह करते हैं। और यदि getValue()
एक अपवाद का कारण बनता है तो आपका एप्लिकेशन लटका दिया जाता है क्योंकि लॉक जारी नहीं होता है। यह सुनिश्चित करने के लिए कि यह सुरक्षित है, आपको try
.. finally
को लपेटने की आवश्यकता है। इस मामले केवल कोड ब्लॉक जो myLockObject
पर पहुंच आवश्यक इंतजार करेगी में
if(Cache["someData"] == null)
{
lock(myLockObject) // or other shared lock for that single value
{
if(Cache["someData"] == null)
{
Cache["someData"] = getValue();
}
}
}
:
दूसरी ओर जब एक Cache
वस्तु का उपयोग कर, आप यह करते हैं। Cache
तक पहुंचने वाले अन्य लोग समानांतर में ठीक चल रहे होंगे। और यदि getValue()
एक अपवाद फेंकता है तो आपके लॉक को अन्य थ्रेड निष्पादन जारी रखने के बिना किसी भी समस्या के जारी किया जाता है।
स्रोत
2012-04-22 14:59:14
कैश संग्रह को माइक्रोसॉफ्ट द्वारा थ्रेड-सुरक्षित बनाया गया था। कोई बाहरी लॉकिंग की आवश्यकता नहीं है। –
कैश स्वयं थ्रेड-सुरक्षित होने पर केवल परमाणुता की स्थिरता की गारंटी नहीं देता है। ऊपर उदाहरण कोड देखें। यदि आपके पास 'लॉक' कथन नहीं है तो कई थ्रेड एक ही समय में 'getValue()' को कॉल करेंगे, भले ही कैश थ्रेड सुरक्षित हो या नहीं। –
और मुझे डाउनवोट के पीछे कारण आश्चर्य है, "यह जवाब उपयोगी नहीं है"। वास्तव में? –