我已经阅读了很多与此相关的问题,但我还没有找到一个可靠的答案,这就是我决定发表自己的问题的原因。
我见过许多实现Singleton设计模式的Web应用程序和Web服务,但最近我一直认为这不是一个真正的原因,为什么这应该是一个好主意(让我知道我是不是错了)
我的猜测:不,我认为它将对所有请求使用相同的实例,这将使我的代码变慢并且不会让我利用垃圾收集器。
Ex:请求1调用MethodInStaticInstance()让我们说需要2秒。 请求2调用MethodInStaticInstance()等待直到请求1调用该方法,因为它已被使用。 (我可能错了,这就是我看到的,我不知道这是不是真的)
我想静态实例在Web应用程序中有用的唯一方法是静态资源可以异步使用。你觉得怎么样?
答案 0 :(得分:0)
static
个实例没有什么特别之处,它们的方法与调用者在同一个线程上运行。
所以不,静态实例不会“异步”使用,除非他们的调用者在不同的线程上。
在Web应用程序的上下文中,如果两个用户在相似的时间调用相同的函数,如果该方法不是线程安全的话,则存在竞争条件的真实可能性。
答案 1 :(得分:0)
当您不想实例化对象以运行方法时,静态非常有用。考虑这个例子:
public class MyMath
{
public int sum(int a, int b)
{
return a + b;
}
}
要获得一笔金额,您需要执行以下操作:
MyMath m = new MyMath();
int c = m.sum(1, 2);
但是,如果sum
是静态的,您可以执行以下操作并避免不必要地创建对象:
int c = MyMath.sum(1,2);
现在,关于异步使用它:没有理由你不能。它不比非静态类更多或更少线程安全(尽管使用非静态类,如果需要,可以在单独的线程中使用单独的实例)。
编辑:单身人士
当您想要确保只发生一个对象的实例化时,通常会使用单例模式。原因各不相同,因为想要这样做。我过去曾用它来限制与资源的连接数。是否可以异步使用它取决于您的实现。您可以实现锁定以防止对方法的多个调用同时运行,但您必须专门执行此操作。