代码之家  ›  专栏  ›  技术社区  ›  Colin Desmond

ASP.NET MVC中的线程安全

  •  6
  • Colin Desmond  · 技术社区  · 17 年前

    我怀疑这也适用于一般的ASP.NET,但我不确定。

    如果我在一个控制器上有一个动作方法,比如mycontroller.dosomethingengineering,三个客户机同时点击它,那么它本质上是线程安全的,还是我需要做些什么来确保这三个并发调用不会相互作用?

    3 回复  |  直到 12 年前
        1
  •  13
  •   John Saunders    17 年前

    该方法中的局部变量将为每次调用。我假定(不知道MVC)控制器实例是按请求的,所以任何实例成员都是安全的。

    但是,如果存在任何静态成员或其他共享成员,那么它们就不安全。

        2
  •  2
  •   John Nicholas    17 年前

    如果方法实例化了它自己的所有变量,并且不使用任何静态成员,那么在所有情况下都应该是正常的。

    如果对象一次被多个线程引用,并且它多次读取某些类级变量,而这些变量可以在读取之间被另一个线程修改,那么可能存在问题。

    如果它只读取一次数据,并且在类级别上不写任何东西,那么多线程就不可能是一个问题。

        3
  •  2
  •   LongChalk_Rotem_Meron    12 年前

    不一定。取决于你所说的“线程安全”是什么意思。

    例如,假设它们共享一个实体框架,称为“db”,并且在某个表上工作。既然你称你的控制器为“mycontroller”,我们就称这个db.mytable吧。 每个请求都会调用MyController的不同实例。到目前为止,线程安全。每个控制器创建一个myEntities db=new myEntities()的实例;到目前为止是线程安全的。但是,由于db.mytable是IEnumerable<mytable>类型,因此它们相互作用。假设它们在数据库中的同一个实体上工作(不带锁),比如db.mytable[0]——它们将互相覆盖(“最后一个保存wins的实体”)。

    站点的3个用户将有三个独立的指针(在堆栈中)指向同一位置(在数据库中)。这不是线程问题。这是一个数据锁定问题。