线程同步被锁(这个)混淆

本文关键字:这个 混淆 同步 线程 | 更新日期: 2023-09-27 18:31:21

I hava a class:

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

线程同步被锁(这个)混淆

这里的解释是时间。

Main中启动线程的代码设法在线程完全启动并达到它也将尝试获取锁的地步之前转义锁。

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

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

所以这里根本没有僵局。

死锁是指两个线程相互等待,或类似的东西。此代码中没有该代码。

此代码中不能有死锁。

当线程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中的位置都是无关紧要的。您可以向上或向下移动它)

如果你看一下维基,你会发现要有一个死锁,一个人必须有

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

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

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