2012-04-22 25 views
6

Application एएसपीनेट में कक्षा Lock थ्रेड सुरक्षा का समर्थन करने के लिए तंत्र है।एप्लिकेशन बनाम कैश: लॉक तंत्र

जैसा कि हम जानते हैं - Application वैश्विक स्तर पर पहुंचा जा सकता है।

नमूना:

Application.Lock(); 
Application["MyCode"] = 21; 
Application.UnLock(); 

ठीक।

लेकिन

इसके अलावा Cache विश्व स्तर पर पहुँचा जा सकता है (और does not ताला तंत्र है और यह भी निकालने के लिए किया/आइटम जोड़ने)

तो क्यों करता है Application एक ताला तंत्र है और Cache नहीं करता है?

उत्तर

6

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() एक अपवाद फेंकता है तो आपके लॉक को अन्य थ्रेड निष्पादन जारी रखने के बिना किसी भी समस्या के जारी किया जाता है।

+1

कैश संग्रह को माइक्रोसॉफ्ट द्वारा थ्रेड-सुरक्षित बनाया गया था। कोई बाहरी लॉकिंग की आवश्यकता नहीं है। –

+3

कैश स्वयं थ्रेड-सुरक्षित होने पर केवल परमाणुता की स्थिरता की गारंटी नहीं देता है। ऊपर उदाहरण कोड देखें। यदि आपके पास 'लॉक' कथन नहीं है तो कई थ्रेड एक ही समय में 'getValue()' को कॉल करेंगे, भले ही कैश थ्रेड सुरक्षित हो या नहीं। –

+0

और मुझे डाउनवोट के पीछे कारण आश्चर्य है, "यह जवाब उपयोगी नहीं है"। वास्तव में? –

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