2010-05-21 10 views
8

मैं जानना चाहता हूं कि एक वर्ग दूसरे से विरासत में है या नहीं, क्या कक्षाओं को बेस क्लास में परिभाषित लॉक ऑब्जेक्ट साझा करना या लॉक ऑब्जेक्ट होना बेहतर है प्रत्येक विरासत स्तर पर परिभाषित किया गया। वर्ग के प्रत्येक स्तर पर एक ताला वस्तु कीविरासत कक्षाओं के भीतर लॉक का उपयोग करने के लिए सबसे अच्छा अभ्यास क्या है

एक बहुत ही सरल उदाहरण

public class Foo { 
    private object thisLock = new object(); 
    private int ivalue; 

    public int Value { 
    get { 
     lock(thisLock) { 
     return ivalue; 
     } 
    } 
    set { 
     lock(thisLock) { 
     ivalue= value; 
     } 
    } 
    } 
} 

public class Foo2: Foo { 
    private object thisLock2 = new object(); 

    public int DoubleValue { 
    get { 
     lock(thisLock2) { 
     return base.Value * 2; 
     } 
    } 
    set { 
     lock(thisLock2) { 
     base.Value = value/2; 
     } 
    } 
    } 
} 

public class Foo6: Foo2 { 
    private object thisLock6 = new object(); 

    public int TripleDoubleValue { 
    get { 
     lock(thisLock6) { 
     return base.DoubleValue * 3; 
     } 
    } 
    set { 
     lock(thisLock6) { 
     base.DoubleValue = value/3; 
     } 
    } 
    } 
} 

एक साझा ताला वस्तु का एक बहुत ही सरल उदाहरण

public class Foo { 
    protected object thisLock = new object(); 
    private int ivalue; 

    public int Value { 
    get { 
     lock(thisLock) { 
     return ivalue; 
     } 
    } 
    set { 
     lock(thisLock) { 
     ivalue= value; 
     } 
    } 
    } 
} 

public class Foo2: Foo {  
    public int DoubleValue { 
    get { 
     lock(thisLock) { 
     return base.Value * 2; 
     } 
    } 
    set { 
     lock(thisLock) { 
     base.Value = value/2; 
     } 
    } 
    } 
} 
public class Foo6: Foo2 {  
    public int TripleDoubleValue { 
    get { 
     lock(thisLock) { 
     return base.DoubleValue * 3; 
     } 
    } 
    set { 
     lock(thisLock) { 
     base.DoubleValue = value/3; 
     } 
    } 
    } 
} 

कौन सा उदाहरण ताला लगा प्रबंधन करने के लिए पसंदीदा तरीका है विरासत वर्ग के भीतर?

उत्तर

11

आप, .नेट फ्रेमवर्क में अक्सर अपने दूसरे विकल्प खोजने के बजाय एक क्षेत्र की एक संपत्ति का उपयोग कर यद्यपि (जैसे, CommunicationObject.ThisLock Property) कर सकते हैं:

public class Foo { 
    private readonly object thisLock = new object(); 
    private int ivalue; 

    protected object ThisLock { 
    get { 
     return thisLock; 
    } 
    } 

    public int Value { 
    get { 
     lock(ThisLock) { 
     return ivalue; 
     } 
    } 
    set { 
     lock(ThisLock) { 
     ivalue= value; 
     } 
    } 
    } 
} 

और

public class Foo2: Foo {  
    public int DoubleValue { 
    get { 
     lock(ThisLock) { 
     return base.Value * 2; 
     } 
    } 
    set { 
     lock(ThisLock) { 
     base.Value = value/2; 
     } 
    } 
    } 
} 
+1

.NET परावर्तक को लोड किए गए असेंबली के भीतर 'इस लॉक 'संपत्ति की 106 (!) घटनाएं मिलती हैं। तो मुझे लगता है कि इसे सही तरीके से * सर्वश्रेष्ठ अभ्यास * कहा जा सकता है। :-) – dtb

4

कितने आपके पास लॉक ऑब्जेक्ट के उदाहरणों को उन चीज़ों की संख्या के बराबर होना चाहिए जिन पर आप पहुंच को नियंत्रित करने का प्रयास कर रहे हैं। यदि सभी उप-वर्ग समान संसाधन साझा कर रहे हैं, तो वहां एक एकल लॉक ऑब्जेक्ट होना चाहिए, उदाहरण के लिए, बेस क्लास में फ़ील्ड/प्रॉपर्टी।

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

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