在多线程中调用静态方法

时间:2013-07-29 07:48:29

标签: c# multithreading

考虑以下代码:

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之后调用PrintSomthing运行单独线程,因为我没有Test的实例来调用Somthing

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

但是当写上面的代码时,Test已锁定,然后调用Somthing

为什么编译器有此行为?

2 个答案:

答案 0 :(得分:12)

这里没有任何东西可以导致使用另一个线程;为什么会这样?你的代码:

  • 创建Test
  • 的实例
  • 在该实例上调用(callvirtPrint
    • 围绕自己Monitor锁定(不是一个好主意,顺便说一句)
    • 睡10秒
    • 将一行写入控制台
    • 发布Monitor锁定
  • 调用(call)静态Something方法
    • 将一行写入控制台

无需额外的线程。我应该强调:即使你没有发布Monitor锁定(使用Monitor.Enter而没有Monitor.Exit),它在线程方面也会有相同的作用;再次:lock 不创建线程

lock只会在lock期间停止(阻止) 其他 线程,但会创建一个互斥的区域。它不会创建线程。

答案 1 :(得分:3)

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