日期:2014-05-17  浏览次数:20509 次

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楼的代码还是不行。

------解决方案--------------------
探讨

这样还不行吗?