C# 在多线程中调用静态方法
考虑以下代码:C# 在多线程中调用静态方法,c#,multithreading,C#,Multithreading,考虑以下代码: public class Test { public void Print() { lock (this) { System.Threading.Thread.Sleep(10000); Console.WriteLine("Print"); } } public static vo
public class Test
{
public void Print()
{
lock (this)
{
System.Threading.Thread.Sleep(10000);
Console.WriteLine("Print");
}
}
public static void Somthing()
{
Console.WriteLine("Somthing");
}
}
在print
方法Ilock
中,类和Somthing
是一个静态方法。我希望在调用Somthing
之后调用Print
时,Somthing
单独运行线程,因为我没有用于调用Somthing
的Test
实例
private static void Main(string[] args)
{
var test = new Test();
test.Print();
Test.Somthing();
}
但是当写上面的代码时,Test
锁定,然后调用Somthing
private static void Main(string[] args)
{
var test = new Test();
test.Print();
Test.Somthing();
}
为什么编译器会有这种行为?这里没有任何东西会导致使用另一个线程;为什么会这样?您的代码:
- 创建
Test
- 在该实例上调用(
)callvirt
Print
- 它需要一个
锁(顺便说一句,这不是个好主意)监视器
- 睡10秒钟
- 向控制台写入一行
- 释放
锁监视器
- 它需要一个
- 调用(
)静态call
方法Something
- 它会向控制台写入一行
监视器
锁(使用监视器。在不使用监视器的情况下输入
。退出
),它对线程的作用也是相同的;同样:lock
不会创建线程
lock
只需停止(阻塞)other线程在lock
期间锁定同一对象-它会创建一个互斥区域。它不会创建线程。这里没有任何东西会导致使用另一个线程;为什么会这样?您的代码:
- 创建
Test
- 在该实例上调用(
)callvirt
Print
- 它需要一个
锁(顺便说一句,这不是个好主意)监视器
- 睡10秒钟
- 向控制台写入一行
- 释放
锁监视器
- 它需要一个
- 调用(
)静态call
方法Something
- 它会向控制台写入一行
监视器
锁(使用监视器。在不使用监视器的情况下输入
。退出
),它对线程的作用也是相同的;同样:lock
不会创建线程
lock
只需停止(阻塞)other线程在lock
期间锁定同一对象-它会创建一个互斥区域。它不创建线程。lock
只是避免另一个线程访问要访问的块中的代码,直到返回句柄为止。在您的情况下,实际上只有一个线程(外部锁)。lock语句中的代码不会被任何东西锁定。代码以同步方式执行,这意味着线程在指定的时间内休眠,然后调用Something
方法。lock
只是避免另一个线程访问块内的代码,直到返回句柄为止。在您的情况下,实际上只有一个线程(外部锁)。lock语句中的代码不会被任何东西锁定。代码被同步执行,这意味着线程在指定的时间内休眠,然后调用Something
方法。我认为lock(this)
锁定当前实例,静态方法不绑定到任何特定的实例,而是绑定到类类型本身,因此产生了严重的混乱。不过,我会让更有见识的人给出一个连贯的答案,因为我很可能是错的……:)锁定本身并不会创建单独的线程,它只是锁定访问,以便一次只能有一个线程进入。如果一切都像代码一样在单个线程中调用,那么锁定也不会真正起作用。在示例代码中,我只看到一个线程?建议您避免为公共可访问的类型锁定this
。“我希望在打印后调用Somthing时,Somthing单独运行线程”。为什么会这样?我相信lock(this)
会锁定当前实例,而静态方法不会绑定到任何特定实例,而是绑定到类类型本身,因此会产生严重的混淆。不过,我会让更有见识的人给出一个连贯的答案,因为我很可能是错的……:)锁定本身并不会创建单独的线程,它只是锁定访问,以便一次只能有一个线程进入。如果一切都像代码一样在单个线程中调用,那么锁定也不会真正起作用。在示例代码中,我只看到一个线程?建议您避免为公共可访问的类型锁定this
。“我希望在打印后调用Somthing时,Somthing单独运行线程”。你为什么这么想?