锁定静态变量

时间:2011-04-29 03:07:24

标签: c# variables static locking

我在服务器端有一个以下的课程。

public class Sample
{
    private enum Status
    {
        NotEvaluated,
        Yes,
        No
    }

    private static object _lockObj = new object();
    private static Status _status = Status.NotEvaluated;

    public static Status GetStatus()
    {
        if (_status == Status.NotEvaluated)
        {
            lock (_lockObj)
            {
                if (_status == Status.NotEvaluated)
                {
                    //some evaluation code which sets status to either Yes/No;
                    _status = Status.Yes;
                }
            }
        }

        return _status;
    }

}

上面的锁定机制有什么问题吗?我需要锁定吗?因为它是服务器端(多个请求将在那里)并且变量是静态的,我认为它应该在评估时被锁定。

如果我错了,请纠正我。

由于

1 个答案:

答案 0 :(得分:2)

您没有/不应该对“if(_status == Status.NotEvaluated)”进行外部检查。虽然看起来没有任何“坏”会发生,如果你把它留下来,有可能第二个线程可能不必要地进入“if”,就在第一个线程设置_status到Status.Yes之前。是的,你需要锁定:

“作为一项基本规则,您需要锁定访问任何可写共享字段。” http://www.albahari.com/threading/part2.aspx

lock (_lockObj)
   {
      if (_status == Status.NotEvaluated)
         {
            // some evaluation code which sets status to either Yes/No;
            _status = Status.Yes;
         }
      return _status;    
  }