roa*_*oul 5 c# static multithreading constructor
保证每个应用程序域只运行一次静态构造函数.在创建第一个实例或引用任何静态成员之前自动调用它.CLR如何保证这一点?
假设有两个线程访问一个同时具有静态构造函数的类.这两个线程都是第一次.如下:
class SomeType
{
Static SomeType()
{
Console.Write("hello");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,由于同时性,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();
}
}
Run Code Online (Sandbox Code Playgroud)