在多线程中调用静态方法

本文关键字:静态方法 调用 多线程 | 更新日期: 2023-09-27 18:25:13

考虑以下代码:

public class Test
{
        public void Print()
        {
            lock (this)
            {
                System.Threading.Thread.Sleep(10000);
                Console.WriteLine("Print");
            }
        }
        public static void Somthing()
        {
            Console.WriteLine("Somthing");
        }
}

print方法I lock中,类和Somthing是一个静态方法。我希望在Print之后调用Somthing时,Somthing单独运行线程,因为我没有Test的实例来调用Somthing

private static void Main(string[] args)
{
     var test = new Test();
     test.Print();
     Test.Somthing();
}

但在编写上述代码时,Test被锁定,然后调用Somthing

编译器为什么会有这种行为?

在多线程中调用静态方法

这里没有任何内容会导致使用另一个线程;为什么会这样?您的代码:

  • 创建Test的实例
  • 在该实例上调用(callvirtPrint
    • 它本身带有Monitor锁(顺便说一句,这不是一个好主意)
    • 睡眠10秒
    • 将一行写入控制台
    • 释放Monitor
  • 调用(call)静态Something方法
    • 它向控制台写入一行

不需要额外的螺纹。我应该强调:即使没有释放Monitor锁(通过使用不带Monitor.ExitMonitor.Enter),它对线程的工作方式也是一样的;再次:lock不创建线程

lock只是在持续时间内从lock停止(阻止)其他线程对同一对象执行操作——它创建了一个互斥区域。它不会创建线程。

lock只是避免另一个线程访问要访问的块内的代码,直到返回句柄为止。在这种情况下,实际上只有一个线程(外部锁)。lock语句中的代码不会被任何东西锁定。代码被同步执行,这意味着线程在指定的时间内休眠,然后调用Something方法。