代码之家  ›  专栏  ›  技术社区  ›  Andy

lock()类型强制转换安全吗?

  •  4
  • Andy  · 技术社区  · 16 年前
    public class A { }
    public class B:A { }
    
    void foo()
    {
       A a = new B();
       B b = a as B;
    }
    

    对于给定的实例设置,将 lock(a) 相当于 lock(b) ?

    我是说,锁定是互斥的吗?如果我 在一个线程和 锁(b) B 以前创建的?

    1 回复  |  直到 16 年前
        1
  •  12
  •   Brian R. Bondy    16 年前

    lock(a){} 相当于 lock(b){}

    The lock() documentation 声明lock语句通过获取给定引用类型对象的互斥锁,将语句块标记为关键部分。

    a 和 b 两者都是同一个物体,所以它们是等价的。事实上 一 b

    Source .

    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锁