我想用一些代码示例来理解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++;
}
}
}
答案 0 :(得分:0)
lock
this
阻止多个线程同时进入该对象的锁码块。当一个线程在代码块中时,其他线程正在等待当前锁定&#39;这个&#39;对象被释放。
答案 1 :(得分:0)
它运行正常,因为示例太简单了。它等同于你锁定一些私有变量的情况。我说如果用lock(t)换循环,它甚至会运行正常,因为lock支持递归。
但是想象一下,如果其他线程锁定了你的变量并进入了一些无限循环?刚创建变量后?会发生僵局。
现在让我们假设您将代码与锁定(this)作为第三方dll。你永远不知道图书馆的消费者会有多聪明......