2009-04-07 64 views
0

在C#中,類字段表示每個線程都有自己的該對象的實例。實例字段和線程起源的安全問題

E.g.線程1將擁有自己的對象a實例,對象b也是如此。

因此,不同PC上的Web應用程序的2個用戶應該在不同的線程下訪問實例字段(說一個集合),對嗎?

這使我乞討的問題,爲什麼我需要編寫代碼來同步集合?如果集合是基於實例而不是共享狀態的話。

是否只是在我修改其狀態時可能讓另一個線程試圖讀取集合的事實。我說「是嗎」,因爲這只是通過我實際編寫的代碼的可能情況?例如。產生一個線程來讀取非同步集合,並使用原始線程寫入集合。或者還有其他問題嗎?

我已經把這個在初學者部分,因爲這似乎是一個基本問題。

感謝

回答

2

在C#中,一個類在默認情況下沒有它的每個對象的自己的實例。

類實例和線程是兩個單獨的構造(除非成員被標記爲[ThreadStatic]或其他一些異常)。如果您創建實例,然後運行單獨的線程,它將在相同的實例上工作(除非單獨的線程創建它自己的對象實例)。

由於線程通常會在相同的實例上工作(爲了共享數據和狀態),因此您需要適當地同步它們。

如果線程永遠不會共享對象的狀態或實例,那麼您不必擔心同步。但實際上這很少見 - 通常線程正在處理某種類型的共享數據。如果每個產生的線程創建自己的對象,並且沒有其他線程與它們對話,則可以忽略同步。

+0

正是我在我的理解中缺少的東西。感謝理論! – dotnetdev 2009-04-07 23:37:02