本のサンプルコードを見直して、次のコード(簡略化された)に遭遇しました。 コードでは、Subscribe(T subscriber)
が呼び出されると、スレッドはロックセクションに入ります。 を呼び出し、ロック内のコードがAddToSubscribers(T subscriber)
メソッドを呼び出すと、メソッドに別のロックが発生します。なぜこの第二のロックが必要ですか?ロック内部ロックの背後にある根拠?
public abstract class SubscriptionManager<T> where T : class
{
private static List<T> subscribers;
private static void AddToSubscribers(T subscriber)
{
lock (typeof(SubscriptionManager<T>))
{
if (subscribers.Contains(subscriber))
return;
subscribers.Add(subscriber);
}
}
public void Subscribe(T subscriber)
{
lock (typeof(SubscriptionManager<T>))
{
AddToSubscribers(subscriber);
}
}
}
実際、この例はWCFブックから、サブスクリプションマネージャはWCFサービスの基本クラスですクラス。したがって、インスタンスメソッドが必要です。私はまた、あなたが述べたように、Typeのロックは危険であるとMSDNから読んでいますが、コンテキストがWCFであるという事実は何か違いがありますか? –
Yeonho
@ダニエルはまったくありません。 –
@Marc "プライベート静的読み取り専用オブジェクトsyncLock =新しいオブジェクト();" - これはすべてのSubscriptionManagerに対して単一のグローバルロックを与えます;元のコードは構築されたタイプごとに1つのロックを持っていると考えています(つまり、別個の「T」ごとに1つ)。 –
Joe