我有一个类,这个类被设计为一个POCO类,各种线程和任务可以读取其值,而其他人只偶尔更新这些值。这似乎是ReaderWriterLockSlim的理想应用场景。
问题在于,如果需要保证线程安全的属性是bool类型,是否过度使用?如果是int或DateTime类型会发生什么?
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(); }
}
}
}
这段代码是否过度设计,而一个简单的解决方案会更好呢?
public bool TheValue { get; set; }
...足够吗?由于类型是bool,所以安全吗?如果是,什么时候会变得不安全?byte?int?DateTime?
编辑
我的基本架构是将此类存储状态。可能有一个服务负责对此类进行写操作。所有其他类都可以读取并根据此状态数据执行其逻辑。我会尽力确保所有数据一致,但如下所述,我的主要关注点是数据的原子性和分裂。
结论
感谢大家的回复,所有回复都很有价值。我的主要关注点是写入/读取的原子性(即担心分裂)。对于.NET平台,如果问题变量是小于4个字节的内置值类型,则读取和写入是原子性的(例如,short和int是可以的,long和double则不是)。