gpt4 book ai didi

.net - 多个属性的线程安全模式

转载 作者:行者123 更新时间:2023-12-01 12:47:00 26 4
gpt4 key购买 nike

我有一个对象,它有大约 15 个属性,包括字符串、小数?、日期时间?还是整数?我有一个从多个线程操作的此类的集合。我想确保以线程安全的方式访问(读/写)对象属性的值,同时编写最少的代码。有没有这样一种方法,而不是使用私有(private)支持者并在每个属性的 getter 和 setter 中进行显式锁定?以下是我现在必须为每个属性做的事情:

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 snapshot = whatever.Properties;
var name = snapshot.PersonName;
...
var amount = snapshot.BeginAmount;

现在这些将始终保持一致。另外还有零锁。读取/更新引用也始终是原子的——因此没有撕裂的值(value)。

重要的是不要做:

var name = whatever.Properties.PersonName;
...
var amount = whatever.Properties.BeginAmount;

因为这里不再保证 nameamount 来自同一个 ManyProperties 实例:有人可能已经交换了引用两次提取。

关于.net - 多个属性的线程安全模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14965109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com