我有一个班级:
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()会导致死锁,但事实并非如此。我不知道为什么。
答案 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)块。