Да lock(a){}
эквивалентно lock(b){}
.
В документации 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");
}
}
}
}
замок приобрел
... 10 секунд прохода
снятие блокировки
b замок приобрел
снятие блокировки b