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