2009-08-11 18 views
5

मेरे पास कॉलिंग उपयोगकर्ता के कुछ विशेषताओं को प्राप्त करने के लिए सुरक्षा कक्षा के साथ एक डब्ल्यूसीएफ सेवा है। हालांकि, जब थ्रेड सुरक्षा की बात आती है तो मैं काफी खराब हूं - इस बिंदु पर, मुझे इसके साथ बहुत कुछ करने की आवश्यकता नहीं है, और केवल बहु-थ्रेडिंग की समस्याओं की प्राथमिक सैद्धांतिक समझ है।क्या यह कोड थ्रेड-सुरक्षित है? मैं इसे थ्रेड-सुरक्षित कैसे बना सकता हूं?

public class SecurityService 
{ 
    public static Guid GetCurrentUserID() 
    { 
     if (Thread.CurrentPrincipal is MyCustomPrincipal) 
     { 
      MyCustomIdentity identity = null; 
      MyCustomPrincipal principal = (MyCustomPrincipal)Thread.CurrentPrincipal; 
      if (principal != null) 
      { 
       identity = (MyCustomIdentity)principal.Identity; 
      } 

      if (identity != null) 
      { 
       return identity.UUID; 
      } 
     } 
     return Guid.Empty; 
    } 
} 

वहाँ कोई मौका कुछ वहाँ में गलत हो सकता है कि अगर विधि 2 अलग धागे से एक ही समय में कहा जाता है की जा रही है है:

निम्नलिखित समारोह को देखते हुए? मेरे दुःस्वप्न में मुझे भयानक परिणाम दिखाई देते हैं यदि ये विधियां गलत होती हैं, जैसे कि किसी को गलती से किसी और का डेटा मिल रहा है या अचानक सिस्टम प्रशासक बन रहा है। एक सहयोगी (जो वह एक विशेषज्ञ नहीं था, लेकिन वह मुझसे बेहतर है) ने सोचा कि यह शायद ठीक रहेगा क्योंकि वहां वास्तव में कोई साझा संसाधन नहीं है जो वहां पहुंचा जा रहा है।

या यह एक, जो डेटाबेस तक पहुंच जाएगा - क्या यह बहुत बुरा हो सकता है?

public static User GetCurrentUser() 
    { 
     var uuid = GetCurrentUserID(); 
     if (uuid != null) 
     { 
      var rUser = new UserRepository(); 
      return rUser.GetByID(uuid); 
     } 
     return null; 
    } 

सूत्रण के प्रिंसिपलों के बारे में चर्चा का एक बहुत कुछ नहीं है, लेकिन मैं नीचे गिर जाते हैं और भ्रमित हो जब यह वास्तव में इसे लागू करने के लिए, और जब यह लागू करने के लिए जानते हुए भी आता है के लिए करते हैं। किसी भी मदद की सराहना की।

यदि यह स्पष्ट नहीं है तो मैं इन कार्यों के संदर्भ/उद्देश्य के बारे में अधिक समझा सकता हूं।

संपादित करें: rUser.GetByID() फ़ंक्शन मूल रूप से एक भंडार के माध्यम से कॉल करता है जो NHibernate का उपयोग कर डेटाबेस को देखता है। तो मुझे लगता है कि यहां डेटाबेस "साझा संसाधन" है, लेकिन वास्तव में ऐसा नहीं है जो इस ऑपरेशन के लिए लॉक या संशोधित हो जाता है ... किस मामले में मुझे लगता है कि यह ठीक है ...?

+0

धन्यवाद, एरिक्स। मैं अब आसानी से और अधिक महसूस करता हूँ। – Gavin

उत्तर

12

जो मैं देखता हूं, उससे पहला उदाहरण केवल थ्रेड-स्थानीय स्टोरेज और स्टैक-आधारित चर का उपयोग करता है, जबकि दूसरा केवल स्टैक-आधारित चर का उपयोग करता है।

दोनों थ्रेड-सुरक्षित होना चाहिए।

मैं नहीं बता सकता कि GetByID थ्रेड सुरक्षित है या नहीं। यह देखने के लिए देखें कि क्या यह किसी भी साझा/स्थैतिक संसाधनों तक पहुंचता है। यदि ऐसा होता है, तो यह उन संसाधनों की सुरक्षा के लिए कुछ अतिरिक्त कोड के बिना थ्रेड-सुरक्षित नहीं है।

+0

मैं आपके शब्दों को सत्य के रूप में लेता हूं, और अपने आवेदन में अपने आवेदन में सुरक्षा उल्लंघनों के लिए सभी ज़िम्मेदारी रखता हूं। :) – Gavin

+0

इसे लाएं :- डी आपको यह समझना चाहिए कि GetByID भी थ्रेड सुरक्षित है। –

3

आपके पास ऊपर दिए गए कोड में कोई कोड नहीं है जो वैश्विक स्थिति बदलता है, इसलिए आप पूरी तरह से सुनिश्चित हो सकते हैं कि यह एकाधिक समान धागे द्वारा बुलाया जा रहा समस्या नहीं होगी। सुरक्षा प्रमुख जानकारी प्रत्येक धागे से बंधी है, इसलिए वहां कोई समस्या नहीं है।

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

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