Безопасно ли приведение типов (lock)? - PullRequest
4 голосов
/ 15 мая 2010
public class A { }
public class B:A { }

void foo()
{
   A a = new B();
   B b = a as B;
}

для данной установки экземпляра, будет lock(a) эквивалентно lock(b)?

Я имею в виду, будет ли блокировка взаимоисключающей? Если я lock(a) в одном потоке и lock(b) в другом потоке, получу ли я взаимоисключающий доступ к этому единственному экземпляру B, созданному ранее?

1 Ответ

12 голосов
/ 15 мая 2010

Да 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...