这个“单例”应该在ASP.NET应用程序中是线程安全的吗?

请注意,“singleton”在稍微不常见的意义上使用 – “对象像HttpContext.Current一样可见”,与普通的“具有一个共享实例的对象”不同。

我为我的asp.net MVC应用程序使用单例类型的UserContext类。 此类允许我将用户数据存储为强类型会话对象。 我遇到了这个CodeReview问题,并想知道是否有必要关注此应用程序上下文中的线程安全性。

这是我的代码的简化:

 public class UserContext { private UserContext() { } public static UserContext Current { get { if (HttpContext.Current.Session["UserContext"] == null) BuildUserContext(); return (UserContext)HttpContext.Current.Session["UserContext"]; } } private static void BuildUserContext() { if (!user.Identity.IsAuthenticated) return; var uc = new UserContext { IsAuthenticated = true }; // ...snip... // Set up user data // Save it into the session HttpContext.Current.Session["UserContext"] = uc; } #region Class members public bool IsAuthenticated { get; internal set; } public string Name { get; internal set; } // ...snip... // Other properties public void Refresh() { BuildUserContext(); } public void Flush() { HttpContext.Current.Session["UserContext"] = null; } #endregion } 

到目前为止,我还没有任何锁定问题,但是现在该网站的流量不是很高。 我应该采用Jon Skeet的线程安全模型还是IIS为我管理?

访问Session已经是Thread安全的。

通常,只要您以线程安全的方式访问静态属性中的任何共享状态,就不会有任何问题。

ASP会话状态带有同步逻辑。 如果执行的页面需要对会话状态的写访问权,则会话状态被锁定,并且同一会话上的其他请求必须等到第一个请求完成。

请参阅同步对会话状态的访问 。