实例对象中的C#lock对象

时间:2011-11-17 14:56:19

标签: c# multithreading locking external critical-section

我面对的情况迫使我锁定一个锁定对象,该对象位于实例对象内部我想知道它是否真实?

澄清:

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

允许这样做吗?

2 个答案:

答案 0 :(得分: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
        }
    }
}

答案 1 :(得分:2)

这很好。这是合法的C#。事实上,这是首选的方式,而不是锁定这个。因为这个可以从类外部锁定,而 objLock 是私有的,只能在类中锁定,从而更好地控制并避免一些死锁条件

然而,施法可能会引发异常。您可能想要处理该场景