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

本文关键字:运行 一次 应用程序域 构造函数 静态 | 更新日期: 2023-09-27 18:08:21

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

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

那么由于同时性,CLR如何保证控制台只写一次呢?使用锁或其他东西??

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

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

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

查看这篇MSDN博客文章中的示例。基本上,这个死锁:

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();
    }
}