【问题标题】:locking static variable锁定静态变量
【发布时间】:2011-04-29 03:07:23
【问题描述】:

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

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

}

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

如果我错了,请纠正我。

谢谢

【问题讨论】:

    标签: c# variables static locking


    【解决方案1】:

    您没有/不应该对“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;    
      }
    

    【讨论】:

    • 我猜 OP 试图通过在他知道不必锁定时不锁定来进行优化,但 lock() 相当轻量级 - 这不是您需要做的优化.
    猜你喜欢
    • 2011-02-03
    • 2018-11-22
    • 2023-03-24
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多