c# - lock - ¿Cómo bloquear correctamente un tipo de valor?
synlock c# (4)
Estaba leyendo acerca de enhebrar y sobre el bloqueo. Es una práctica común que no puede (no debería) bloquear un tipo de valor.
Entonces, la pregunta es, ¿cuál es la forma recomendada de bloquear un tipo de valor? Sé que hay algunas maneras de hacer una cosa pero no he visto un ejemplo. Aunque hubo un buen hilo en los foros de MSDN, parece que ahora no puedo encontrarlo.
Gracias
Siempre estoy usando una variable separada para bloquear:
object syncObj = new object();
void Foo()
{
lock(syncObj)
{
// do some stuff
}
}
El bloqueo en los tipos de valor no tiene sentido porque los tipos de valores son inmutables y no se pueden modificar. Bloquear en ''esto'' también es problemático porque ''esto'' es visible para el mundo exterior.
Para obtener información acerca de cómo se pretendía usar originalmente el Monitor, vea Monitor (sincronización)
Use otro objeto para el candado.
int valueType;
object valueTypeLock = new object();
void Foo()
{
lock (valueTypeLock)
{
valueType = 0;
}
}
Dependiendo de su situación, es posible que pueda evitar el uso de bloqueos aprovechando System.Threading.Interlocked el mismo código en el ejemplo de Jon se convierte en:
System.Threading.Interlocked.Exchange(valueType,0)
Tu pregunta está redactada de tal manera que me sugiere que no entiendes completamente el bloqueo. No bloquea los datos, se bloquea para proteger la integridad de los datos. El objeto que traba es inconsecuente. Lo que importa es que bloquee el mismo objeto en otras áreas de su código que altera los datos que están siendo protegidos.