c#实例对象中的锁对象

本文关键字:对象 实例 | 更新日期: 2023-09-27 18:15:12

我面临的情况,迫使我锁定一个锁对象是实例对象的内部,我想知道它是真的还是假的?

for澄清:

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

允许这样做吗?

c#实例对象中的锁对象

锁定的对象属于同一个类,但属于不同的实例。从这个意义上说,您没有破坏封装,但您仍然应该倾向于提取代码,以便可以防止对外部对象的锁定。下面是一个例子:

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
        }
    }
}

这很好。它是合法的c#。实际上,这是比锁定这个更可取的方法。因为这个可以从类外部锁定,而objLock是私有的只能在类内锁定,给你更好的控制和避免一些死锁条件

但是,强制转换可能会抛出异常。你可能想处理这个场景