asp.net这样使用lock正确吗?
因为写了一个方法,用数据库内置对象导出数据,所以想判断超过3个人使用导出,就提示等待,现在实现代码如下,不知道多用户并发是否能用lock锁住,希望大家指点一下。
virtual static int importUserCount = 0;
private static object lockImport = new object();
public void aa()
{
lock (lockImport)
{
importUserCount++;
}
if (importUserCount > 3)
{
..执行的代码
lock (lockImport)
{
importUserCount--;
}
}
else
{
throw new Exception("当前已超过3人正在导出数据,请稍候再试!");
}
}
------解决方案--------------------
virtual 关键字换成 volatile
if (importUserCount > 3) 改成 if (importUserCount < 3)
其他没什么问题
------解决方案--------------------
就看你想实现什么了
lock你可以把他看成是执行代码块,意思就是他是以块来执行的,不会被其它程序给插队执行,要不不执行,要执行就得执行完lock(){}里面的内容
------解决方案--------------------
不行
lock (lockImport)
{
importUserCount++;
}
第一个lock结束,就有可能其他线程就会进来,改写importusercount的值,造成你下面判断错误
------解决方案--------------------volatile是确保多线程操作是,让你获取到最新的值。
8楼的代码还是不行。
------解决方案--------------------