我有一个主要设计为 POCO 类的类,各种线程和任务可以读取它的值,只有其他人只是偶尔更新这些值。这似乎是 ReaderWriterLockSlim 的理想方案。
问题是,在类中,如果需要线程安全的属性,如果该属性是布尔值,这是否矫枉过正?如果它是一个 int 会发生什么?约会时间?
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; }
……就够了吗?因为Type是bool,安全吗?如果是这样,什么时候变得不安全?字节?诠释?约会时间?
编辑
我的基本架构是拥有此类存储状态。也许有一项服务负责对此类进行写入。所有其他类都可以根据此状态数据读取并执行其逻辑。我会尽我所能确保所有数据是一致的,但如下所述,我主要关心的是数据的原子性和分割。
结论
感谢大家的回复,都很有价值。我主要关心的是写入/读取的原子性(即担心分裂)。对于 .NET 平台,如果所讨论的变量是小于 4 字节的内置值类型,则读写是原子的(例如,short 和 int 可以,long 和 double 不是)。