【问题标题】:Static constructors are guaranteed to be run only once per application domain.How?静态构造函数保证每个应用程序域只运行一次。如何?
【发布时间】:2014-08-03 14:03:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# multithreading constructor static


    【解决方案1】:

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

    【讨论】:

    • 所以我可以得出结论,CLR使用Lock来保证一次只有一个线程可以触发静态构造函数。是吗?
    猜你喜欢
    • 2011-02-09
    • 2015-07-08
    • 1970-01-01
    • 2011-10-26
    • 2022-07-07
    • 1970-01-01
    • 2019-07-27
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多