在 MVC 模型中的何处初始化静态属性并实现锁

Where to Initialize Static Properties in an MVC Model & Implementing a Lock

我正在尝试为我的网站松散地实施我自己的 'lock' 或 'mutex'。为此,我使用了 isLocked 属性 让服务器知道是否有其他用户正在 运行 更新。我想初始化它的值一次,但我不确定我的解决方案是否会这样做。这是完整的示例:

模型中:

public abstract class BaseModel
{
    public static bool isLocked = false;
}

我在哪里使用 属性:

public class OtherModel : BaseModel
{
    public OtherModel() : base()
    {
        if (/*condition &&*/ !BaseModel.isLocked)
        {
            BaseModel.isLocked = true;
            //update
            BaseModel.isLocked = false;
        }
    }
}

服务器会初始化 isLocked 一次(第一次实例化 BaseModel 时)还是我需要在 Global.asx 文件中设置它的值?

编辑:@Michael This was shared 更详细地解释了解决方案。

是的,服务器会初始化一次isLocked。但是,你有一个更大的问题。这里存在竞争条件。

有可能在您检查 isLocked 是否为 true 和将 isLocked 设置为 true 之间,另一个线程可能也在检查 isLocked 并发现它为 false,并且你们都可能将其设置为 true 并认为您两者都有静态锁定。

这就是为什么您不应该使用这样的方法进行锁定的原因。而是使用静态对象,然后在该对象上使用 c# lock 语句,如下所示:

public class ViewModel
{
    public static object lockObject = new Object();
}

lock(Model.lockObject)
{
   // do something...
}

如果需要测试密码是否被锁定,那么使用Monitor.TryEnter。

if (Monitor.TryEnter(Model.lockObject))
{
    try
    {
        // use object
    }
    finally
    {
        Monitor.Exit(Model.lockObject);
    }
}

您没有在要锁定的代码周围使用 lock 语句的原因是什么?

例如

public class ViewModel
{
    public static Object Lock = new Object();
}        
public void Update()
{
    lock (ViewModel.Lock)
    {
        //Perform updates
    }
}

您可以查看与使用 lock here 相关的好的答案,而不是我重复已经回答过的内容。