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锁定