Tengo una clase que está diseñada principalmente como una clase POCO, con varios subprocesos y tareas podrían leer sus valores, y solo otros ocasionalmente actualizando estos valores. Este parece ser un escenario ideal para ReaderWriterLockSlim.Se requiere acceso de bloqueo a un bool o es Overkill
La pregunta es, en la clase, si la propiedad que necesita ser segura para subprocesos, si la propiedad es un bool, ¿es esa exageración? ¿Qué pasa si es un int? ¿Fecha y hora?
public class MyClass
{
private bool _theValue = false;
private ReaderWriterLockSlim _theValueLock = new ReaderWriterLockSlim();
public bool TheValue
{
get
{
bool returnVal = false;
try
{
_theValueLock.EnterReadLock();
returnVal = _theValue;
}
finally
{ _theValueLock.ExitReadLock(); }
return returnVal;
}
set
{
try
{
_theValueLock.EnterWriteLock();
_theValue = value;
}
finally
{ _theValueLock.ExitWriteLock(); }
}
}
}
Es todo este código exageración, y un simple ...
public bool TheValue { get; set; }
... sería suficiente? Porque el tipo es bool, ¿es seguro? si es así, ¿cuándo no se vuelve seguro? byte? ¿En t? ¿Fecha y hora?
edición
Mi arquitectura básica es tener este estado almacenamiento de clases. Tal vez tenga un servicio a cargo de hacer las escrituras en esta clase. Todas las demás clases pueden leer y realizar su lógica en función de estos datos de estado. Haré todo lo posible para asegurarme de que todos los datos sean consistentes, pero como se indica a continuación, mi principal preocupación fue la atomicidad y la fragmentación de los datos.
Conclusión
Gracias a todos por su respuesta, todas fueron valiosas. Mi principal preocupación era la atomicidad de las escrituras/lecturas (es decir, preocupado por las férulas). Para la plataforma .NET, si la variable en cuestión es un tipo de valor incorporado que tiene menos de 4 bytes, la lectura y la escritura son atómicas (por ejemplo, short e int son finas, long y double no).
No protegerlo es muy pesado debajo de matar. No puede obtener una respuesta precisa sin mostrar cómo se usa la propiedad. Bloquear en el nivel de propiedad muy raramente funciona. –
más para mi propia referencia algunos enlaces [link] (http://www.albahari.com/threading/) las mejores prácticas sobre el enhebrado, [link] (http://blogs.msdn.com/b/ericlippert/archive/ 2011/05/26/atomicity-volatility-and-immutability-are-different-part-one.aspx) atmoicity, voltile gracias a @brian, [link] (http://blogs.msdn.com/b/brada/ archive/2003/04/03/49896.aspx) lectura rápida en atomicity gracias a @reed – Andre
Como nota personal, escuchando dnr.tv y el comentario de jon skeet sobre bloqueo de bools, busqué este http://askjonskeet.com/answer/6873994/Boolean-Property-Getter-and-Setter-Locking, que básicamente dice que, en escenarios de subprocesos múltiples, podría ser una buena idea bloquearlo. – Andre