2010-12-07 90 views
5

可能重複:
ASP .NET SingletonSingleton類或在ASP.NET MVC應用程序的靜態方法的類

我知道單例類和靜態屬性的類之間的一般區別/方法,但我想知道它是如何影響ASP.NET MVC Web應用程序中的併發性(登錄應用程序的許多用戶)?例如,我們將設置存儲在我們的單例(或靜態屬性)類中。兩個用戶是否有可能突然開始看到/共享相同的設置?我的意思是,如果一個用戶改變他的設置(他們被存儲在內存中用於應用程序的運行時),它會影響其他用戶嗎?據我所知,IIS爲應用程序創建了一個w3wp.exe進程,因此所有的用戶/訪問者都將在同一進程中,所以這對任何事情都有影響嗎?

+0

這個杜佩,這本身就是一個欺騙過:http://stackoverflow.com/ question/3714971/single-class-class-and-static-class-difference-between-one-class-class-and-static-class – jfar 2010-12-07 23:15:34

+0

如果你必須指出某件事至少做對了,那麼jfar會停止你的廢話。我的問題確實是一個騙局,但不是你所鏈接到的一個騙局。 – mare 2010-12-07 23:44:08

回答

10

簡短的回答,是的,用戶會看到任何靜態屬性的相同值。它將在會話之間共享。

長答案:是的,另外如果每個會話都試圖在同一時間更新共享屬性,那麼最終會出現不希望的行爲,特別是如果共享(靜態)屬性是動態增長的類型(任何集合類型) 。訪問或修改共享屬性的值時,您需要處理併發性。

具有單例或靜態類的唯一原因是專門與所有連接共享一組值/設置/配置數據。如果所有用戶都需要相同的信息,它將保持內存利用率低。在這種情況下,您只需要初始化一次值或使用鎖定來自動更新它,以確保一次只有一個線程正在更改信息。任何數量的線程都可以讀取數據而不會相互干擾。

如果您需要不同用戶的不同值,最好使用實例屬性,因爲您不必擔心與鎖定相關的併發性和性能問題。

靜態方法很好。實例和靜態方法之間唯一真正的區別在於它們被調用的方式。即使實例方法只在一個位置保存在內存中。只有實例屬性被賦予它們自己的內存空間。

7

您的想法是正確的,單身人士和靜態類是由多個用戶共享。如果存儲的信息應該是「用戶特定的」,這不是一件好事。

「IIS爲應用程序創建了一個w3wp.exe進程,因此所有用戶/訪問者都將在同一進程內,所以這對任何內容都有影響嗎?」

同樣,您的目標權利,在ASP.Net應用程序中擁有一個單例類,意味着在該過程中只有一個對象實例。

我想你可能會通過了解關於外出進程會話服務器有點受益:http://msdn.microsoft.com/en-us/library/ms972429.aspx

HTH