静态实例是异步使用的

本文关键字:异步 实例 静态 | 更新日期: 2023-09-27 18:30:49

我已经阅读了很多与此相关的问题,但我还没有找到可靠的答案,这就是为什么我决定发布我自己的问题。

我已经看到很多实现单例设计模式的Web应用程序和Web服务,但最近我一直在想,没有一个真正的理由为什么这应该是一个好主意(如果我错了,请告诉我)

我的

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

例如:请求 1 调用 MethodInStaticInstance() 假设它需要 2 秒。 请求 2 调用 MethodInStaticInstance() 等待请求 1 完成调用该方法,因为它已被使用。(我可能是错的,我是这样看的,我不知道这是真的还是假的)

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

静态实例是异步使用的

static实例没有什么特别之处,它们的方法与调用方运行在同一线程上。

所以不,静态实例不会"异步"使用,除非它们的调用方位于单独的线程上。

在 Web 应用的上下文中,如果两个用户在相似时间调用同一函数,如果该方法不是线程安全的,则存在争用条件的可能性。

当您不想实例化对象来运行方法时,静态很有用。 请考虑以下示例:

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

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

编辑:单身人士

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