在多线程中调用静态方法
本文关键字:静态方法 调用 多线程 | 更新日期: 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
的实例 - 在该实例上调用(
callvirt
)Print
- 它本身带有
Monitor
锁(顺便说一句,这不是一个好主意) - 睡眠10秒
- 将一行写入控制台
- 释放
Monitor
锁
- 它本身带有
- 调用(
call
)静态Something
方法- 它向控制台写入一行
不需要额外的螺纹。我应该强调:即使没有释放Monitor
锁(通过使用不带Monitor.Exit
的Monitor.Enter
),它对线程的工作方式也是一样的;再次:lock
不创建线程。
lock
只是在持续时间内从lock
停止(阻止)其他线程对同一对象执行操作——它创建了一个互斥区域。它不会创建线程。
lock
只是避免另一个线程访问要访问的块内的代码,直到返回句柄为止。在这种情况下,实际上只有一个线程(外部锁)。lock语句中的代码不会被任何东西锁定。代码被同步执行,这意味着线程在指定的时间内休眠,然后调用Something
方法。