2011-04-18 9 views
6

मैं सिंगलटन वस्तु 'सेवा' और दो तरीकों से प्रारंभ और इसे जारी करने के लिए है:'डबल-चेक-लॉकिंग' के लिए अभिव्यक्ति हमेशा सत्य क्यों होती है?

public class BaseService 
{ 
    protected static readonly object StaticLockObject = new object(); 
} 

public abstract class WebServiceBase<TService> : BaseService 
    where TService : System.Web.Services.Protocols.SoapHttpClientProtocol, new() 
{ 
    protected static void EnsureServiceIsOpened() 
    { 
     if (Service == null) 
     { 
      lock (StaticLockObject) 
      { 
       if (Service == null) 
       { 
        Service = new TService(); 
       } 
      } 
     } 
    } 

    protected static void EnsureServiceIsClosed() 
    { 
     if (Service != null) 
     { 
      lock (StaticLockObject) 
      { 
       if (Service != null) // Why expression is always true 
       { 
        Service.Dispose(); 
        Service = null; 
       } 
      } 
     } 
    } 

टिप्पणी ReSharper (मैं संस्करण 5.1 का उपयोग करें) एक उल्लेख चेतावनी प्रदर्शित करता है के साथ लाइन के लिए ...

प्रश्न 1: क्यों?

प्रश्न 2: यह 'EnsureServiceIsOpened' विधि में "समान" संदेश क्यों प्रदर्शित नहीं करता है?

धन्यवाद।

उत्तर

2

यह रीशर्पर 5.X कोड विश्लेषण इंजन में बग है। रीशेर्पर 6.0 में फिक्स्ड।

Btw, ReSharper 6 अधिक डबल लॉक पैटर्न विश्लेषण सामान :) लाता

4

रिशेर्पर कोड का सीमित विश्लेषण करता है, और दो नेस्टेड if बयान ठीक उसी तरह देखता है। एक थ्रेडेड वातावरण में, रिशेर्पर द्वारा टिप्पणी पूरी तरह से सच होती है - पहले if के बाद Servicenull होगा। पाठ्यक्रम के एक बहुप्रचारित envrionment में, यह लागू नहीं होता है, क्योंकि Service बाहर से बदला जा सकता है। यह एक ऐसा मामला है जहां आपको इस फ़ाइल के लिए संदेश को पुनर्विक्रय करने या संदेश को सरपट करने के लिए कोड को एनोटेट करना चाहिए, क्योंकि यह एक बहुप्रचारित वातावरण में सत्य नहीं है।

+0

यह अपने कोड एक भी लड़ी एप्लिकेशन को तोड़ने नहीं होगा - क्यों यह एक * चेतावनी * मुझे पहेली। :/ – mayu

+0

क्योंकि ऐसा हो सकता है। कोड विश्लेषण केवल इतना ही जा सकता है - और यही कारण है कि यह चेतावनी प्रकट होती है। – Femaref

+0

मुझे रिशेर्पर द्वारा दिखाए जाने में कोई समस्या नहीं है, मुझे नहीं लगता कि यह एक चेतावनी होनी चाहिए। :) – mayu

3

ऐसा प्रतीत होता है कि Resharper इस विश्लेषण में गलती कर रहा है। चूंकि Service स्थानीय चर नहीं है, इसलिए यह नहीं पता कि अभिव्यक्ति हमेशा सत्य होगी।

कारण पहले संस्करण के लिए त्रुटि दिखाई नहीं दे रही है क्योंकि डबल-चेक-लॉक मुहावरे इतना आम है, और यह इसका सामान्य रूप है। उन्होंने शायद उस मामले के लिए परीक्षण किया और गलत चेतावनी को हटा दिया।

EnsureServiceIsClosed में प्रदर्शित तकनीक आम नहीं है क्योंकि इसमें दौड़ की स्थिति होती है। एक और थ्रेड Service द्वारा इंगित ऑब्जेक्ट का उपयोग कर सकता है-या उसके बाद इसका निपटारा किया जा रहा है। यह संभव नहीं होगा यदि कोड StaticLockObject पर सर्विस लॉक का उपयोग करता है, लेकिन यदि यह लॉक लेता है, तो ऑब्जेक्ट बनाने और निपटाने के लिए यह सब डबल-चेक लॉकिंग रिगामरोल करने का कोई कारण नहीं है। इसलिए, यह विवादास्पद रूप से निश्चित है कि यह कोड त्रुटिपूर्ण है।

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