2011-03-19 19 views

Respuesta

4

En el caso de new, el Type no importa, la instancia lo hace. En este caso, está hablando de un objeto synclock: un objeto que se utiliza para bloquear secciones de código (s) para evitar el acceso simultáneo.

Usar otro Type que object para sincronizar es una pérdida de memoria porque no utiliza esta instancia para nada más.

Hay circunstancias en las que puede bloquear otro tipo: cuando necesita bloquear una instancia específica. El problema principal es: la instancia debe inicializarse para bloquearla.Y en la mayoría de los casos, desea sincronizar la iniciación de la instancia :)

Pero en algunos casos, puede bloquear la instancia directamente; como un diccionario, por ejemplo (bueno, casi directamente en este caso;)).

private Dictionary<string,string> _dictionary = new Dictionary<string,string>(); 

public void AddValue(string key, string value) 
{ 
    lock (((IDictionary)_dictionary).SyncRoot) // SyncRoot recommended 
    { 
     if (!_dictionary.ContainsValue(value)) 
      _dictionary.Add(key, value); 
    } 
} 

Pero la cuestión es: incluso si esto va a funcionar, siempre preguntarse: "¿No es una idea mejor para crear un objeto de fijación específica en lugar"?

+1

¡Agradable! No sabía sobre la propiedad 'SyncRoot'. –

5

En mi opinon cualquier tipo de referencia puede ser bloqueado, la razón por la cual se utiliza un objeto ficticio es evitar los errores comunes de cierre:

bloquean Las construcciones comunes (este), bloqueo (typeof (MyType)), y bloquear ("myLock") violar esta directriz:

lock (this) is a problem if the instance can be accessed publicly. 


    lock (typeof (MyType)) is a problem if MyType is publicly 

accesible.

lock("myLock") is a problem because any other code in the process 

utilizando la misma cadena, compartirán la misma bloqueo.

3

Estoy seguro de que sabes que el artículo Lock Statement (C# Reference).

En general, evite el bloqueo en un tipo público, o instancias fuera del control de su código. Las construcciones comunes bloqueo (esto), cerradura (typeof (MyType)), y bloqueo ("myLock") violen esta directriz:

  • bloqueo (esto) es un problema si la instancia se puede acceder públicamente
  • bloqueo (typeof (MyType)) es un problema si MyType es accesible al público.
  • bloqueo (“myLock”) es un problema ya que cualquier otro código en el proceso mediante el misma cadena, compartirá la misma cerradura .

La mejor práctica es definir un objeto privadopara bloquear en, o una variable objeto estático privada para proteger los datos comunes a todas las instancias.

Cuestiones relacionadas