.net 多属性的线程安全模式
我有一个对象,它有大约15个属性,分别是String、decimal?和DateTime?还是整数?。 我有一个从多个线程操作的此类集合。我希望确保以线程安全的方式访问(读/写)对象属性的值,同时编写最少的代码。 有没有这样一种方法来代替使用私有后台程序和在每个属性的getter和setter中执行显式锁定? 以下是我现在要为每个酒店做的事情:.net 多属性的线程安全模式,.net,multithreading,properties,thread-safety,.net,Multithreading,Properties,Thread Safety,我有一个对象,它有大约15个属性,分别是String、decimal?和DateTime?还是整数?。 我有一个从多个线程操作的此类集合。我希望确保以线程安全的方式访问(读/写)对象属性的值,同时编写最少的代码。 有没有这样一种方法来代替使用私有后台程序和在每个属性的getter和setter中执行显式锁定? 以下是我现在要为每个酒店做的事情: public class ManyProperties { private Object mLock = new Object; pri
public class ManyProperties
{
private Object mLock = new Object;
private string _personName;
public string PersonName {
get {
lock (mLock){
return _personName;
}
}
set {
lock (mLock){
_personName = value;
}
}
}
private string _beginAmount;
public decimal? BeginAmount {
get {
lock (mLock){
return _beginAmount;
}
}
set {
lock (mLock){
_beginAmount = value;
}
}
}
}
属性通常不会单独工作。如果无法获得正确有效的值对等,那么让每个属性都线程安全是没有帮助的。更合适的方法是使整个内容不可变,并让调用者获得一个快照:
public class ManyProperties
{
private readonly string _personName;
public string PersonName { get { return _personName; } }
private readonly decimal? _beginAmount;
public decimal? BeginAmount { get { return _beginAmount; } }
public ManyProperties(string personName, string decimal? beginAmount) {
_personName = personName;
_beginAmount = beginAmount;
}
}
然后:
这些将始终保持一致。另外还有零锁。读取/更新引用也总是原子性的,因此没有被破坏的值
重要的是不要做:
var name = whatever.Properties.PersonName;
...
var amount = whatever.Properties.BeginAmount;
因为这里不再保证
name
和amount
来自同一manyproperty
实例:可能有人在两次获取之间交换了引用。请阅读并编辑您的问题,以便更清楚地了解您试图实现的目标。为了获得更好的性能,您可以使用ReaderWriterLockSlim和每个属性的不同锁定对象
var name = whatever.Properties.PersonName;
...
var amount = whatever.Properties.BeginAmount;