我在服务器端有一个以下的课程。
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;
}
}
上面的锁定机制有什么问题吗?我需要锁定吗?因为它是服务器端(多个请求将在那里)并且变量是静态的,我认为它应该在评估时被锁定。
如果我错了,请纠正我。由于
答案 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;
}