2011-11-17 153 views
3

我面临的情况,迫使我锁定实例对象内的锁对象,我想知道它是真的还是不是?实例对象内的C#锁对象

为澄清:

public class classA 
{ 
    object objLock = new object(); 
    public void MethodA(object objClassA) 
    { 
     classA cls = (classA)objClassA; 
     lock(cls.objLock) 
     { 
      Do something with cls 
     } 
    } 
} 

是允许这样做吗?

+1

你在做什么是语法上合法的,但代码看起来很可疑。 – Kit

回答

2

这很好。这是合法的C#。事实上,这是首选的方式,而不是锁定这个。由于这个可以从类而objLock是私人只能在类内锁定外面被锁住,让你更好地控制和避免一些死锁情况

然而铸造可能会抛出异常。您可能想要处理该场景

+0

是不是这样,因为他锁定了一个不同实例中的对象,以至于他仍然可能遇到死锁问题(即在另一个实例中锁定私有变量与锁定“this”实际上没有区别)?由于提到的其他答案确实没有外部代码应该锁定类(或类本身)中的对象,即使这些外部对象是同一类的实例。 –

+0

我的大问题是关于死锁。但我发现使用线程同步可以解决这个问题。在我的问题中“用cls做什么”是在while循环中。 – amir110

5

您锁定的对象在同一个类中,但是是不同的实例。从这个意义上说,你不打破封装,但你仍然应该更喜欢提取代码,以便防止锁定外部对象。下面是一个例子:

public class classA 
{ 
    private readonly object objLock = new object(); 

    public void MethodA(object objClassA) 
    { 
     classA cls = (classA)objClassA; 

     cls.DoSomething(); 
    } 

    private void DoSomething() 
    { 
     lock (this.objLock) 
     { 
      Do something with cls 
     } 
    } 
}