Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定静态变量_C#_Variables_Static_Locking - Fatal编程技术网

C# 锁定静态变量

C# 锁定静态变量,c#,variables,static,locking,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 Stat

我在服务器端有一个如下的类

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;
    }

}
上面的锁止机构有什么问题吗?我需要锁门吗?因为它是服务器端的(会有多个请求),并且变量是静态的,所以我认为应该在评估时锁定它

如果我错了,请纠正我


谢谢

您没有/不应该对“if(\u status==status.NotEvaluated)”进行外部检查。虽然如果您将其保留,似乎不会发生任何“坏”情况,但第二个线程可能会在第一个线程将_status设置为status.Yes之前输入不必要的“if”。是的,您需要锁定:

作为基本规则,您需要锁定访问任何可写共享字段的权限


我猜OP是想通过不锁定来进行优化,而他知道自己不需要锁定,但是lock()相当轻量级——这不是您需要进行的优化。
lock (_lockObj)
   {
      if (_status == Status.NotEvaluated)
         {
            // some evaluation code which sets status to either Yes/No;
            _status = Status.Yes;
         }
      return _status;    
  }