2011-07-27 78 views
4

MSDN文檔說,Stream類的實例方法(包括Stream.Write)不保證是線程安全的,但它是什麼意思?如果一個線程試圖在Stream對象上調用Stream.Write之前,其他線程沒有從同一個對象上的同一方法返回,會發生什麼?會拋出一個異常,或者這個對象會根據線程的順序排列要發送的數據嗎?有人說沒有鎖定機制就可以打電話。有人可以澄清這一點嗎?Stream.Write方法的線程安全

回答

3

這意味着您不應該在同一時間從不同線程同時在同一個Stream實例上調用諸如Read和Write之類的實例方法。你會得到意想不到的行爲。在某些情況下,可能會拋出異常,在其他情況下,您的數據可能會損壞,而其他數據甚至可能會工作(如果您足夠幸運)。

如果您打算從多個線程使用它們,您需要始終使用適當的鎖定機制來同步對此類共享資源的訪問。

+0

我們是否可以將其推廣到所有實例方法,以至於如果我們將對對象的非靜態方法進行多線程調用,或僅對共享資源(如網絡流或文件訪問)使用鎖定,我們必須使用鎖定?能夠從嘗試和經歷過這些事情的人那裏得到答案是很好的(可以肯定),因爲我也知道最好始終使用鎖定機制。謝謝 –

+0

@Alp:可以創建一個類,使其在內部完全同步,因此是線程安全的。對於這樣的課程,不,您不需要使用外部鎖定。對於大多數使用情況來說,儘管外部實現鎖定要簡單得多,並且在大多數情況下需要正確的操作(例如,爲了確保原子性,在讀取和寫入之間鎖定一個「List」元素)。 'Read' /'Write'也可能在內部同步,但不能保證讀/寫所有給定的數據,因此整個操作仍然需要外部鎖定。 –

+0

@Alp Hancioglu,不,我們不能一概而論。這就是爲什麼所有.NET Framework方法都有文檔記錄,並且通常應明確說明它們是否設計爲線程安全的原因。 –

0

寫是抽象方法,這意味着該方法的行爲在Stream的子類中定義。 Stream的一些子類可以提供線程安全的Write方法,而另一些則不能。所以你不能說Stream如何在不同的線程中同時調用它的Write方法,除非你知道你正在處理什麼特定的Thread子類。

因此,您應該在使用Stream對象時使用鎖定,因爲MSDN表示Stream的方法不能保證是線程安全的,因此可能會有Streams在併發調用時可能會中斷。

但是,如果您明確使用特定的Stream的子類,並且您知道它是線程安全的,則不需要鎖定。