为什么控制器实例变量在mvc中是线程安全的?
本文关键字:线程 安全 mvc 控制器 实例 变量 为什么 | 更新日期: 2023-09-27 18:04:07
根据文档,实例成员不能保证线程安全。这对我来说似乎很奇怪,因为每次请求都会创建一个新的控制器实例,所以为什么会有任何问题呢?
我想做的是:
public MyController : Controller {
private string _myAwesomeUserName;
protected override void OnAuthorization(AuthorizationContext filterContext) {
_myAwesomeUserName = "BobIsTheMan";
}
public ActionResult ViewSnowboardCollection() {
return View(_myAwesomeUserName);
}
}
https://msdn.microsoft.com/en-us/library/system.web.mvc.controller%28v=vs.118%29.aspx此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。不能保证任何实例成员都是线程安全的。
每次请求都创建一个新的控制器实例
如果有的话,这增加了访问共享状态的可能性。
MSDN文档中的线程安全语句本质上是模板信息。除非另有说明,否则对象通常不保证是线程安全的。当然,这并不意味着它们是完全不安全的,只是它们不能保证线程安全。
根据维基百科关于线程安全的文章:
如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,则该代码是线程安全的。
由于控制器同时访问共享数据是可能的,因此线程安全性无法得到保证。