24

次のような読み取り専用の静的メンバーを作成する場合:

public sealed class MyClass
{
    public readonly static MyClass Instance = new MyClass();
}

一部のスレッドが最初にMyClassにアクセスした場合、静的コンストラクターがMyClass.Instanceフィールドを初期化することがわかっています。しかし、複数のスレッドがすべて同時にMyClassにアクセスする場合(つまり、静的フィールドの初期化はスレッドセーフです)、単一のインスタンス(この場合はMyClass)が作成されますか?

4

2 に答える 2

30

.NET CLR は、静的初期化が常にスレッド セーフであることを保証します。アクセスするスレッドの数や順序に関係なく、常に一度初期化されます。

あなたのコードは、シングルトン パターンの始まりの兆候を示しているようです。
基本的に、クラスを初期化する前にカスタム コードを実行する場合は、自分でスレッド セーフを確保する必要があります。これは、カスタム コードをスレッド セーフにする必要が
ある例です。ただし、静的初期化部分は常にスレッドセーフです。

于 2012-08-28T13:04:04.210 に答える
9

クラスの初期化は、C# 言語の仕様によってスレッド セーフであることが保証されているため、 のインスタンスは 1 つだけMyClass作成されます。その時点から自分でスレッドセーフを確保する必要があります。MSDN リファレンスは次のとおりです。

http://msdn.microsoft.com/en-us/library/aa645612.aspx

于 2012-08-28T12:56:58.910 に答える