关于.net:Singleton类或ASP.NET MVC应用程序中具有静态方法的类

Singleton class or a class with static methods in ASP.NET MVC application

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
ASP .NET Singleton

我知道singleton类和具有静态属性/方法的类之间的一般区别,但我想知道它如何影响ASP.NET MVC Web应用程序中的并发性(许多用户登录到应用程序中)?例如,我们将设置存储在singleton(或静态属性)类中。是否有可能两个用户突然开始查看/共享相同的设置?我的意思是,如果一个用户更改了他的设置(因为这些设置存储在应用程序运行时的内存中),它会影响到另一个用户吗?据我所知,IIS为一个应用程序创建了一个w3wp.exe进程,因此所有用户/访问者都将在同一进程内,这会对任何内容产生影响吗?


简言之,是的,对于任何静态属性,用户都会看到相同的值。它将在会话之间共享。

长回答:是的,另外,如果每个会话都试图同时更新共享属性,则最终可能会出现不需要的行为,特别是如果共享(静态)属性是动态增长的类型(任何集合类型)。在访问或修改共享属性的值时,需要处理并发性。

拥有singleton或static类的唯一原因是与所有连接共享一组值/设置/配置数据。如果所有用户都需要相同的信息,它会使内存利用率保持在较低水平。在这种情况下,您应该注意只初始化一次值,或者使用锁原子地更新值,以确保一次只有一个线程在更改信息。任何数量的线程都可以在不相互干扰的情况下读取数据。

如果不同的用户需要不同的值,那么最好使用实例属性,因为您不需要担心并发性以及与锁定相关的性能损失。

静态方法很好。实例方法和静态方法之间唯一真正的区别是它们的调用方式。甚至实例方法也只保存在一个位置的内存中。只有实例属性有自己的内存空间。


您的想法是正确的,单个类和静态类由多个用户共享。如果存储的信息应该是"用户特定的",那就不是好事。

"IIS为应用程序创建一个w3wp.exe进程,因此所有用户/访问者都将位于同一进程中,因此这会对任何内容产生影响吗?"

同样,您的目标权限,在ASP.NET应用程序中有一个singleton类意味着进程中只有一个对象实例。

我认为您可能会受益于了解一些进程外会话服务器:http://msdn.microsoft.com/en-us/library/ms972429.aspx

高温高压