c# - safe - ¿Por qué se realizan bloqueos en objetos separados?
thread c# (3)
Posible duplicado:
Diferencia entre bloqueo (locker) y bloqueo (variable_which_I_am_using)
En todos los ejemplos de código "seguro para subprocesos" que he visto, se bloquean en un objeto ficticio separado. ¿Por qué no se pueden realizar bloqueos directos en los datos en cuestión?
Jeff Richter (autor de CLR Via C #) explica por qué en este artículo sobre la sincronización segura de subprocesos .
Específicamente, en ese artículo, la sección "Por qué la gran idea no es tan grande" responde a su pregunta.
Es en realidad un capítulo del libro CLR Via C # .
En resumen, tener un objeto privado como el objeto "synclock" le permite a su clase encapsular y controlar cualquier bloqueo que su clase necesite. Por lo tanto, independientemente de cuántos clientes utilicen su clase, el bloqueo se realiza de manera consistente y correcta.
El bloqueo en un objeto ficticio private
separado le da una garantía de que nadie más está bloqueando ese objeto.
Si bloquea los datos y ese mismo dato es visible para el exterior, perderá esa garantía. Por ejemplo:
public class MyObject
{
public void SharedMethod()
{
lock (this)
{
// Do stuff
}
}
}
class Program
{
static void Main(string[] args)
{
MyObject o = new MyObject();
lock (o)
{
new Thread(() =>
{
// Gets blocked 2s because of external lock
o.SharedMethod();
}).Start();
Thread.Sleep(2000);
}
}
}