保证每个应用程序域只运行一次静态构造函数。如何?

时间:2014-06-13 05:06:25

标签: c# multithreading constructor static

每个应用程序域的静态构造函数为guaranteed to be run only once。 在创建第一个实例或引用任何静态成员之前自动调用它。 CLR如何保证这一点?
假设有两个线程访问一个同时具有静态构造函数的类。 这两个线程都是第一次。 如下:

class SomeType
{
    Static SomeType()
    {
      Console.Write("hello");
    }
}

因此,由于同时性,CLR如何保证控制台只写一次?使用Lock或其他东西??

1 个答案:

答案 0 :(得分:7)

CLR在进入static构造函数之前取出锁定,以保证它只由一个线程执行一次。

如果你在静态构造函数中创建线程,这很容易使你的应用程序死锁。

有关示例,请参阅this MSDN blog post。但基本上,这种僵局:

using System.Threading;
class MyClass
{
    static void Main() { /* Won't run... the static constructor deadlocks */  }

    static MyClass()
    {
        Thread thread = new Thread(arg => { });
        thread.Start();
        thread.Join();
    }
}