[编辑:看起来原始问题涉及双精度而不是整数。所以我认为如果我们将整数更改为双精度,这个问题就成立了。]
从有时返回零值的多个线程中使用的类中读取整数属性时,我遇到了罕见的问题。初始化后值不会更改。
这个问题解决了这个问题。共识是,即使我正在访问一个整数,我也需要同步属性。(一些原始答案已被删除)。我没有在那里选择答案,因为我还没有解决我的问题。
因此,我对此进行了一些研究,但不确定要使用 .Net 4 的哪种锁定机制,或者这些锁定是否应该在类本身之外。
这就是我想使用的:
public class ConfigInfo
{
private readonly object TimerIntervalLocker = new object();
private int _TimerInterval;
public int TimerInterval
{
get
{
lock (TimerIntervalLocker) {
return _TimerInterval;
}
}
}
private int _Factor1;
public int Factor1
{
set
{
lock (TimerIntervalLocker) {
_Factor1 = value;
_TimerInterval = _Factor1 * _Factor2;
}
}
get
{
lock (TimerIntervalLocker) {
return _Factor1;
}
}
}
private int _Factor2;
public int Factor2
{
set
{
lock (TimerIntervalLocker) {
_Factor2 = value;
_TimerInterval = _Factor1 * _Factor2;
}
}
get
{
lock (TimerIntervalLocker) {
return _Factor2;
}
}
}
}
但我读到这非常慢。
另一种选择是ConfigData
在用户端锁定实例,但这似乎需要做很多工作。我见过的另一种选择是Monitor.Enter
,Monitor.Exit
但我认为 Lock 是相同的东西,语法更少。
那么使类的属性线程安全的最佳实践是什么?