[编辑:看起来原始问题涉及双精度而不是整数。所以我认为如果我们将整数更改为双精度,这个问题就成立了。]
从有时返回零值的多个线程中使用的类中读取整数属性时,我遇到了罕见的问题。初始化后值不会更改。
这个问题解决了这个问题。共识是,即使我正在访问一个整数,我也需要同步属性。(一些原始答案已被删除)。我没有在那里选择答案,因为我还没有解决我的问题。
因此,我对此进行了一些研究,但不确定要使用 .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 是相同的东西,语法更少。
那么使类的属性线程安全的最佳实践是什么?