2

我有一堂课:

 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() 会导致死锁,但事实并非如此。我不知道为什么。

4

3 回答 3

4

这里的解释是时间。

启动线程的代码在线程完全启动并到达它也会尝试获取锁之前Main设法逃脱锁。

试着把这Console.Read条线移到lock块里,你就会明白我的意思了。

另请注意,即使线程在Main方法逃脱锁定之前设法到达锁定代码,它也会简单地等待这种情况发生(等待主线程逃脱锁定),然后继续前进。

所以这里根本没有僵局

死锁是两个线程相互等待或类似情况。您在此代码中没有。

于 2013-09-14T09:31:20.500 回答
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))。

于 2013-09-14T09:31:32.497 回答
0

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

于 2013-09-14T09:32:00.817 回答