2016-05-05 4 views
1

ロックオブジェクトとして使用するために正しく初期化されることが保証されている静的な読み取り専用メンバ変数です。つまり、一度に1つのインスタンスにしか触れない(別のプロセスを心配する必要はなく、1つのプロセスでのみ) 。ライブラリクラス自体は、複数のスレッドで複数のインスタンスを持つことができるので、一度に1つのインスタンスしかそのリソースにアクセスしないように、ロックを使用する必要があります。C#のロックオブジェクトは遅延初期化を必要としますか?

私はこのようなロックオブジェクトの宣言をたくさん見てきました。

private static readonly object _lockObj = new object();

は、この保証は、複数のスレッドは、悪いタイミングで、同時に2つのオブジェクトを初期化し、二つのオブジェクトをロックしませんことを!または、私はこのようなロックオブジェクトを作成する必要があります。

private static readonly Lazy<object> _lockObj = new Lazy<object>(() => new object());

P.S.私はロックのためのC#のlock(_lockObj){...}キーワードを参照しています。

+0

どのオブジェクトでもロックを行うことができます。あなたの言うことが真実であれば、 'static readonly'フィールドは意図していない複数の値を持つことができます。彼らが同じクラスにアクセスしている限り、あなたは行かなくてはなりません。 –

+1

CLRは、タイプがappdomainごとに1回初期化されることを保証します。静的フィールド初期化子は、型初期化子の内部で、型の静的コンストラクタの本体の前に実行されます(存在する場合)。したがって、2つのスレッドが同じappdomain内のメソッドを起動していると仮定すると、異なるロックオブジェクトを取得するレースが行われる可能性はありません。 –

+0

このように動作しないと、ソリューションがどのように役立つかわかりません。 2つの異なるオブジェクトを初期化する2つの 'Lazy'インスタンスがあるというリスクで問題を移動するだけです。 –

答えて

2

ランタイムは、静的メンバーフィールドのコピーを1つだけ保証します。クラスのインスタンスがなくても使用することができます。ロックオブジェクトとしての使用は安全です。

+0

オブジェクトがセマフォのようにもう少し複雑であっても、私はこれを行うことができます。レイジー<>初期化を使わずに '' public static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(3) '? – ShuberFu

+0

はい、_semaphoreは使用する前に構築されています。 –

+0

私はあなたがいつもレイジーを使う必要はないと思う。あなたのアプリケーションがリソースにとって重要なものではないのです。 –

関連する問題