c# - 锁定静态变量

标签 c# variables static locking

我在服务器端有一个后续类(class)。

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 (_status == Status.NotEvaluated)”进行外部检查。虽然如果您保留它似乎不会发生任何“坏”情况,但第二个线程可能会在第一个线程将 _status 设置为 Status.Yes 之前不必要地输入“if”。是的,您需要锁定:

“作为一个基本规则,您需要锁定对任何可写共享字段的访问。” 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;    
  }

关于c# - 锁定静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5827414/

相关文章:

c# - 算法 - 聚合重复记录

loops - 如何在 set 命令中使用括号转义变量?

java - void 变量有什么用?

Android volatile 不工作?

c# - 如何在 Visual Studio 2010 中调试 Nunit 测试

c# - a = (x == null) 的最佳语法?空 : x. 函数()

java - 如何创建一个组合两个变量的变量?

android - 既然可以直接使用修饰的静态成员,为什么还要使用 Intent?

java - 'public static final' 还是带有 setter/getter 的 'private static final'?

c# - 使用 TeamFoundationServerFactory 进行缓慢的用户身份验证