Estoy revisando un código de ejemplo en un libro y encontré el siguiente código (simplificado). En el código, cuando se invoca Subscribe(T subscriber)
, el hilo entra en una sección de bloqueo. y luego, cuando el código dentro del bloqueo llama al método AddToSubscribers(T subscriber)
, el método tiene otro bloqueo. ¿Por qué es necesario este segundo bloqueo?razonamiento detrás de la cerradura dentro de la cerradura?
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);
}
}
}
en realidad, este ejemplo proviene de un libro WCF, y la clase SubscriptionManager es la clase base para el servicio WCF clases por lo tanto, se requieren los métodos de instancia. También leí en MSDN que el bloqueo en un Tipo es peligroso, como dijiste, ¿el hecho de que el contexto sea WCF hace alguna diferencia? –
Yeonho
@Daniel ninguno en absoluto. –
@Marc "private static readonly object syncLock = new object();" - esto le da un único bloqueo global para todos los SubscriptionManager; mientras que creo que el código original tiene un bloqueo por tipo construido (es decir, uno para cada "T" distinta). –
Joe