线程同步被锁定困惑(这)

时间:2013-09-14 09:27:14

标签: c#

我有一个班级:

 public class LockTest
 {
    public void LockThis()
    {
        lock (this)
        {
            Console.WriteLine("lock this test");
            System.Threading.Thread.Sleep(5000);
        }
    }

 }
主页中的

 static void Main(string[] args)
 {
LockTest lockTest = new LockTest();

lock (lockTest)
{
        //lockTest.LockThis();
        System.Threading.Thread thread = new Thread(lockTest.LockThis);
        thread.Start();
}
Console.Read();
}

我认为调用lockTest.LockThis()会导致死锁,但事实并非如此。我不知道为什么。

3 个答案:

答案 0 :(得分:4)

这里的解释是时机。

启动线程的Main中的代码设法在线程完全启动之前逃脱锁并且已经达到了它也将试图锁定的程度。

尝试将Console.Read行移至lock块,您就会明白我的意思。

另请注意,即使线程在Main方法转义锁之前设法到达锁定代码,它也只是等待它发生(等待主线程逃脱锁定),并且然后继续前进。

所以这里没有死锁,在所有

死锁是指两个线程彼此等待或类似的情况。你在这段代码中没有。

答案 1 :(得分:2)

此代码中没有死锁。

当线程LockThis启动时,锁由主线程拥有,因此它启动然后继续等待。主线程继续并退出锁(Console.Read之前的行)。此时LockThis线程可以继续。没有死锁。

Main Thread     LockThis
lock            (not started)
start LockThis
                try lock, failure, goes in wait
unlock
Console.Read()
                awakened because the lock is free
                lock
                unlock

另一种情况:主线程启动LockThis线程。然后主线程继续并在LockThis线程甚至开始工作之前退出锁定,因此在它尝试进入锁定之前。即使在这种情况下也没有死锁。

Main Thread      LockThis
lock             (not started)
start LockThis
unlock
                 lock
Console.Read()
                 unlock

(请注意,在这两种情况下,LockThis中的解锁位置都无关紧要。您可以向上或向下移动它)

如果你看一下wiki,你就会发现必须有一个僵局

  

至少有两个资源必须是不可共享的。

您这里只有一个资源(lock (lockTest))。

答案 2 :(得分:0)

在线程锁定lockTest之前,您将离开锁(lockTest)块。