考虑以下代码:
public class Test
{
public void Print()
{
lock (this)
{
System.Threading.Thread.Sleep(10000);
Console.WriteLine("Print");
}
}
public static void Somthing()
{
Console.WriteLine("Somthing");
}
}
在print
方法lock
中,类和Somthing
是静态方法。我希望在Somthing
之后调用Print
,Somthing
运行单独线程,因为我没有Test
的实例来调用Somthing
。
private static void Main(string[] args)
{
var test = new Test();
test.Print();
Test.Somthing();
}
但是当写上面的代码时,Test
已锁定,然后调用Somthing
。
为什么编译器有此行为?
答案 0 :(得分:12)
这里没有任何东西可以导致使用另一个线程;为什么会这样?你的代码:
Test
callvirt
)Print
Monitor
锁定(不是一个好主意,顺便说一句)Monitor
锁定call
)静态Something
方法
无需额外的线程。我应该强调:即使你没有发布Monitor
锁定(使用Monitor.Enter
而没有Monitor.Exit
),它在线程方面也会有相同的作用;再次:lock
不创建线程。
lock
只会在lock
期间停止(阻止) 其他 线程,但会创建一个互斥的区域。它不会创建线程。
答案 1 :(得分:3)
lock
只是避免另一个线程访问块内的代码进行访问,直到返回句柄。在你的情况下,你实际上有一个线程(外部锁定)。 lock语句中的代码不会被任何东西锁定。代码同步执行意味着 - 线程在指定时间内休眠,然后调用Something
方法。