对锁的危险感到困惑(这)

时间:2015-01-30 22:57:57

标签: c# locking

我想用一些代码示例来理解lock(this)的危险。使用代码,如果一切正常,我希望在程序结束时看到1000。 这就是我每次运行它时得到的东西,即使我使用的是锁(这个)。为什么锁定(这个)在这里运作良好?

class Program
    {
        static void Main(string[] args)
        {
            Test t = new Test();
            for (int x = 0; x < 100; x++)
            {
                Thread[] threads = new Thread[10];
                for (int i = 0; i < 10; i++)
                {
                    threads[i] = new Thread(t.ProtectedMethod);
                    threads[i].Start();
                }

                for (int i = 0; i < 10; i++)
                    threads[i].Join();

                Console.WriteLine("Done with {0}", t.i);
            }

        }
    }

    class Test
    {
        public int i = 0;

        public void ProtectedMethod()
        {
            lock (this)
            {
                i++;
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

lock this阻止多个线程同时进入该对象的锁码块。当一个线程在代码块中时,其他线程正在等待当前锁定&#39;这个&#39;对象被释放。

答案 1 :(得分:0)

它运行正常,因为示例太简单了。它等同于你锁定一些私有变量的情况。我说如果用lock(t)换循环,它甚至会运行正常,因为lock支持递归。

但是想象一下,如果其他线程锁定了你的变量并进入了一些无限循环?刚创建变量后?会发生僵局。

现在让我们假设您将代码与锁定(this)作为第三方dll。你永远不知道图书馆的消费者会有多聪明......