5

我在这里看到了很多关于这个主题的讨论。

如果我有一个带有静态方法的静态类连接到数据库或服务器,那么在多用户环境(如网页)中使用它是不是一个坏主意?这会使新用户的线程在接受新用户之前等待以前用户的线程完成他们的调用吗?

这对多线程又有什么影响呢?

谢谢!

4

8 回答 8

6

如果每个静态方法完全负责获取其资源,然后在方法调用的范围内处置其资源(无共享状态),那么您应该不会遇到使用实例类不会遇到的线程问题。然而,我认为更大的问题是依赖公共静态方法(在静态或非静态类中)会在未来产生许多其他设计问题。

  • 首先,您与实现的绑定非常紧密,这总是很糟糕。
  • 其次,测试所有依赖于静态方法的类变得非常困难,因为您被锁定在一个实现中。
  • 第三,创建非线程安全方法确实变得非常容易,因为静态方法只能具有静态状态(在所有方法调用中共享)。
于 2009-04-23T13:38:05.733 回答
3

静态方法在多线程方面没有任何特殊行为。也就是说,您可以期望同时运行该方法的多个“副本”。静态变量也是如此——不同的线程可以同时访问它们,无需等待。除非你小心,否则这会造成混乱。

于 2009-04-23T13:39:39.940 回答
1

是的,这是个坏主意。

当您为所有用户使用一个连接时,如果有人执行需要(比如说 15 秒)仅用于数据库访问的操作,则所有其他用户都必须等待才能连接到数据库

于 2009-04-23T13:40:24.807 回答
0

这个问题有点奇怪。至于为什么你有这么多的静态。

但我认为您是在询问线程问题,所以我会说去查看一些关于线程的文档 h ttp://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx

于 2009-04-23T13:38:04.063 回答
0

静态只是定义方法定义的范围,以及它是如何绑定/调用的。它与多线程无关。

您需要小心使用静态字段。它们由所有线程共享。线程不会相互等待,但您需要锁才能使其工作。

但是,如果您的应用程序比 Hello World 复杂一点,您应该考虑让您的方法不是静态的,而是使用面向对象的模式。

于 2009-04-23T13:38:54.483 回答
0

如果您使用一个静态连接来访问数据库,您将不得不同步方法调用。多个线程通过单个连接向数据库询问数据将... ehhmmm ... 搞砸了。因此,您正在序列化所有线程的数据访问,这将对性能产生很大影响。

如果每个调用都打开自己的连接,则不需要序列化所有线程,因为没有共享连接。为每个请求创建一个连接仍然是一个昂贵的设计。

如果您使用静态连接池,您将减少这种性能影响,因为您只需要序列化对连接池的访问。

此外,静态通常不是一个好的设计决策——它们使单元测试变得非常复杂。您应该考虑使用 Singleton 或 Monostate 模式。

于 2009-04-23T13:41:27.440 回答
0

如果你做了,那将不是问题。如果你做错了,它可能会强制顺序访问资源。

有时对与错之间的区别可能非常微妙且难以发现,但主要的是,任何方法都不应该依赖或锁定类的任何“状态”(成员)。

于 2009-04-23T13:41:46.347 回答
0

我使用静态方法查找对象。我可以在一个地方为 asp.net 应用程序管理所有查找对象(使用缓存),并且所有方法都使用静态方法调用它。

通过这种方式,我不需要在每次需要时都实例化查找对象,并且减少了调用 DB 以提高性能的需要。

于 2009-04-23T14:33:16.567 回答