可能重复:
ASP .NET Singleton
我知道单例类和具有静态属性/方法的类之间的一般差异,但我想知道它如何影响ASP.NET MVC Web应用程序中的并发性(许多用户登录应用程序)?例如,我们将设置存储在我们的单例(或静态属性)类中。两个用户是否有可能突然开始看到/共享相同的设置?我的意思是,如果一个用户更改了他的设置(因为它们存储在应用程序运行时的内存中),它会影响其他用户吗?据我所知,IIS为应用程序创建了一个w3wp.exe进程,因此所有用户/访问者都在同一个进程中,所以这会对任何内容产生影响吗?
答案 0 :(得分:10)
简短回答,是的,用户将看到任何静态属性的相同值。它将在会议之间共享。
长答案:是的,另外如果每个会话都试图同时更新共享属性,最终可能会出现意外行为,尤其是当共享(静态)属性是动态增长的类型(任何集合类型)时。在访问或修改共享属性的值时,您需要处理并发。
拥有单例或静态类的唯一原因是专门与所有连接共享一组值/设置/配置数据。如果所有用户都需要相同的信息,它会使内存利用率降低。在这种情况下,您只需要初始化值一次或使用锁以原子方式更新它,以确保一次只有一个线程正在更改信息。任意数量的线程都可以读取数据而不会相互干扰。
如果您需要为不同用户使用不同的值,最好使用实例属性,因为您不必担心与锁定相关的并发和性能损失。
静态方法很好。实例和静态方法之间唯一真正的区别在于它们的调用方式。甚至实例方法也只在一个位置保存在内存中。只有实例属性有自己的内存空间。
答案 1 :(得分:7)
您的想法是正确的,单个和静态类由多个用户共享。如果存储的信息应该是“用户特定的”,那不是一件好事。
“IIS为应用程序创建了一个w3wp.exe进程,因此所有用户/访问者都将在同一进程中,因此这会对任何内容产生影响吗?”
再一次你的目标权利,在ASP.Net app中有一个单例类意味着在这个过程中只有一个对象的实例。
我认为您可以通过了解一些有关进程外会话服务器的信息来获益:http://msdn.microsoft.com/en-us/library/ms972429.aspx
HTH