【发布时间】:2011-06-21 23:54:42
【问题描述】:
我有一个主要设计为 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 不行)。
【问题讨论】:
-
不保护它是非常严重的杀戮。如果不显示该属性的使用方式,您将无法获得准确的答案。在属性级别锁定很少起作用。
-
作为个人笔记,听了 dnr.tv 和 jon skeet 对锁定布尔值的评论,我查阅了这个 askjonskeet.com/answer/6873994/…,它基本上说,在多线程场景中,这可能是个好主意锁定它。
标签: c# multithreading locking readerwriterlockslim