2013-01-23 34 views
1

我知道實例變量不是線程安全的,因爲它們存儲在堆中。我正在重構ASP.NET單線程應用程序中的代碼,並試圖更多地使用實例變量。實例變量是否應該引起多線程問題?

我的問題是:開發人員避免使用實例變量,因爲可能的多線程問題? (即使應用程序現在不是多線程,現在可能會在未來)。我記得應該使用實例變量來改進設計,使用組合和聚合而不是關聯(與局部變量一樣)。

是否有幫助開發者決定何時使用實例變量以及何時使用局部變量的任何標準。我已經谷歌搜索了這一點,我看了MSDN,但我沒有設法找到我的具體問題的答案。

+0

你可以給你一個代碼的例子,你會傾向於使用實例變量嗎? –

+0

@Steven Doggart,感謝您再次發帖。這是你第二次對我最後一個問題的最後一個評論:http://stackoverflow.com/questions/14467167/data-access-layer-returns-datatable令我困惑。當談話正在擺脫原始問題時,我決定創建一個新問題。 – w0051977

回答

3

你有沒有做過什麼使ASP.NET應用程序單線程?否則,默認情況下是多線程的。如果線程之間共享的對象

實例變量只與多線程應用程序的問題。對於ASP.NET應用程序來說,正常情況是每個線程都創建它自己的對象實例,所以多線程不是問題。

如果您需要在線程之間共享數據,在對象封裝數據仍然是最好的辦法。通過使用私有實例變量並通過方法或屬性訪問它們,您可以確保來自對象之外的所有訪問都是同步的,因爲對象中的代碼完全控制了數據的公開位置。

+0

+1。我來到這個線程來建議多線程可以成爲ASP.NET中的一個問題:http://blogs.msdn.com/b/benchr/archive/2008/09/03/does-asp-net-magically-handle- thread-safety-for-you.aspx – w0051977

+0

@ w0051977:文章在關於哪些類型的訪問需要同步的結論中是非常正確的。如您所見,通常在ASP.NET應用程序中使用的大多數數據不需要同步。 – Guffa

+0

即使在代碼中沒有創建線程,實例變量是否需要同步? – w0051977

0

假設都在談論網頁和網頁的實例變量,那麼你不必擔心多線程和線程安全。 asp.net/web服務器會照顧到這一點。這個msdn article討論了asp.net提供的線程安全性。

0

你實際上指的是靜態變量。靜態變量不是線程安全的(通常情況下,除非您編寫代碼來同步對變量的適當訪問)。 實例變量,相比之下,是線程安全的在asp.net,因爲每個請求的線程將自身拷貝操作

static變量用於存儲需要在所有請求之間共享的數據。如果你沒有這種情況,你不需要使用靜態變量。如果你這樣做,那麼已經有這樣的課程,例如Cache課程。

+0

謝謝。實際上,如果開發人員在編寫代碼時避免使用實例變量,其中包含包含線程的類即新線程() – w0051977

+0

@ w0051977我仍然認爲您對「static」和「instance」變量感到困惑。如果您提供示例代碼,我可能會更好地解釋一下代碼中使用靜態V實例變量的風險。一般來說,儘量避免在asp.net應用程序中使用靜態變量。你會發現在Web應用程序中很少需要它們。 – Icarus

+0

感謝我以前的帖子的答覆者:http:// stackoverflow。com/questions/14467167/data-access-layer-returns-datatable討論了使用線程與實例變量的限制(問題中有一些代碼)。你可以看一下嗎? – w0051977