我在服务器端有一个后续类(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/