1

デフォルトで静的クラスコンストラクターはスレッドセーフですか? それとも明示的にスレッドセーフにする必要がありますか?

4

2 に答える 2

4

CLR は、静的コンストラクターが AppDomain の有効期間全体で 1 回だけ呼び出されることを保証します。静的メンバーが初めてアクセスされるか、インスタンスが作成されるときに呼び出されます。また、AppDomain ごとに 1 回だけ呼び出されるため、1 つのスレッドだけが呼び出すことができると安全に想定できます。

于 2012-09-11T05:46:33.693 に答える
0

スレッドセーフで「一度だけ呼び出されるのか?」という意味であれば、答えはイエスです。ただし、CLR はグローバル ロックを取得して、複数のスレッドが静的コンストラクターを呼び出さないようにすることでこれを行います。これは、別のスレッドがそのロックを取得しようとするようなことを行うと (たとえば、クラスで静的メソッドを呼び出すことによって)、デッドロックが発生する可能性があることを意味します。

たとえば、次のプログラムはデッドロックします (Eric Lippert によるものですが、参照が見つからないようです)。

public class Program
{
    static Program()
    {
        Thread thread = new Thread(Test);
        thread.Start();
        thread.Join();
    }

    public static void Main(string[] args)
    {
        Console.WriteLine("Hello, world!");
    }

    static void Test() { }
}
于 2012-09-11T07:12:52.463 に答える