【发布时间】:2013-11-27 09:20:40
【问题描述】:
我有一个 asp.net 应用程序。我正在使用单例模式来设计我的代码。如下所示……
public static class FactoryClass
{
private static Core obj = null;
private static readonly object padLock = new object();
public static Core GetInstance()
{
lock (padLock)
{
if (obj == null)
{
obj = new Core();
}
}
return obj;
}
}
这个实现是线程安全的。我想知道这个实现是否正确,在 asp.net 的情况下(多个请求将共享一个实例)。请指教……
【问题讨论】:
-
您在 asp.net 中制作静态单例的具体原因是什么?这门课有什么特别贵的东西吗?
-
您是否缺少私有构造函数?
-
作为一般性评论,我个人会在锁本身周围添加另一个
if (obj == null)。如果它已经被实例化了,那么就没有必要承受锁定的影响了。你仍然需要内部的if,这样它就不会被多次创建,但是外部的可以在不需要时绕过整个过程。 -
你还是不清楚。您是否希望用户共享数据?如果您想要在一个请求的整个生命周期内都存在的东西,请使用 HttpContext.Items。如果您想要在一个用户会话的整个生命周期内都存在的东西,请使用 Session。如果您想要单个服务器上的所有用户通用的东西,请使用静态 - 但要准备好处理所有相应的线程相关问题(许多请求可以同时访问该数据)。