静态实例是异步使用的吗?

时间:2014-11-18 23:20:46

标签: c# design-patterns web singleton

我已经阅读了很多与此相关的问题,但我还没有找到一个可靠的答案,这就是我决定发表自己的问题的原因。

我见过许多实现Singleton设计模式的Web应用程序和Web服务,但最近我一直认为这不是一个真正的原因,为什么这应该是一个好主意(让我知道我是不是错了)

我的猜测:不,我认为它将对所有请求使用相同的实例,这将使我的代码变慢并且不会让我利用垃圾收集器。

Ex:请求1调用MethodInStaticInstance()让我们说需要2秒。     请求2调用MethodInStaticInstance()等待直到请求1调用该方法,因为它已被使用。 (我可能错了,这就是我看到的,我不知道这是不是真的)

我想静态实例在Web应用程序中有用的唯一方法是静态资源可以异步使用。你觉得怎么样?

2 个答案:

答案 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);

现在,关于异步使用它:没有理由你不能。它不比非静态类更多或更少线程安全(尽管使用非静态类,如果需要,可以在单独的线程中使用单独的实例)。

编辑:单身人士

当您想要确保只发生一个对象的实例化时,通常会使用单例模式。原因各不相同,因为想要这样做。我过去曾用它来限制与资源的连接数。是否可以异步使用它取决于您的实现。您可以实现锁定以防止对方法的多个调用同时运行,但您必须专门执行此操作。