lock()类型转换是否安全?

And*_*ndy 4 c# locking

public class A { }
public class B:A { }

void foo()
{
   A a = new B();
   B b = a as B;
}
Run Code Online (Sandbox Code Playgroud)

对于给定的实例设置,将lock(a) 等同于lock(b)

我的意思是,锁定是否相互排斥?如果我lock(a)在一个线程和lock(b)另一个线程中,我是否可以获得对B之前创建的单个实例的互斥访问权限?

Bri*_*ndy 12

lock(a){}等同于lock(b){}.

lock()文档声明lock语句通过获取给定引用类型对象的互斥锁来将语句块标记为临界区.

a并且b都是相同的对象,所以是的,它们是等价的.实际上a并且b都是对同一对象的引用.

引用类型之间的强制转换操作不会更改基础对象的运行时类型; 它只会更改用作该对象引用的值的类型.来源.

快速测试程序显示它确实按照记录的方式运行:

namespace ConsoleApplication2
{
    public class A { }
    public class B : A { }

    class Program
    {
        static A a = new B();

        static void MyThread()
        {
            B b = a as B;
            lock (b)
            {
                Console.WriteLine("b lock acquired");
                Console.WriteLine("releasing b lock");
            }

        }


        static void Main(string[] args)
        {
            System.Threading.Thread t = new System.Threading.Thread(MyThread);

            lock(a)
            {
                Console.WriteLine("a lock acquired");               
                t.Start();
                System.Threading.Thread.Sleep(10000);
                Console.WriteLine("Releasing a lock");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

获得锁定
... 10秒钟通过
释放锁定
b锁定获得
释放b锁定