同步线程:这里有冲突吗?

本文关键字:冲突 这里 线程 同步 | 更新日期: 2023-09-27 18:25:09

class Class1
    {
        private static object consoleGate = new Object();
        private static void Trace(string msg)
        {
            lock (consoleGate)
            {
                Console.WriteLine("[{0,3}/{1}]-{2}:{3}", Thread.CurrentThread.ManagedThreadId,
                    Thread.CurrentThread.IsThreadPoolThread ? "pool" : "fore",
                    DateTime.Now.ToString("HH:mm:ss.ffff"), msg);
            }
        }
        private static void ProcessWorkItems()
        {
                    lock (consoleGate)
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            Trace("Processing " + i);
                            Thread.Sleep(250);
                        }
                    }
            Console.WriteLine("Terminado.");
        }
        static void Main()
        {
            ProcessWorkItems(); Console.ReadLine();
        }
    }

输出:

Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Terminated

为什么这段代码有效?ProcessWorkItems 静态方法锁定 ConsoleGate 对象,Trace 也执行了相同的操作。我以为这个对象只能被锁定一次。¿一些解释?

同步线程:这里有冲突吗?

C# 中的锁是可重入的 - 单个线程可以多次获取同一锁而不会阻塞。正弦,你在这里只有一个线程没有问题 - 锁用于跨多个线程同步对资源的访问。

来自 MSDN 文档 lock

lock 关键字确保一个线程不会进入关键线程 部分代码,而另一个线程位于关键部分。如果 另一个线程尝试输入锁定的代码,它将等待,阻止, 直到释放对象。

有关可重入锁定

的更多信息,请参阅此 SO 线程:"什么是可重入锁定和一般概念?

您在此处显示的所有代码都在同一线程上运行。这就是为什么它就像你没有使用"锁"一样运行