我正在尝试为我的网站松散地实现我自己的“锁”或“互斥锁”。为此,我使用 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文件中设置它的值?
编辑:This was shared @Michael 更详细地解释了解决方案。
请您参考如下方法:
是的,服务器会初始化一次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);
}
}
