MSDN文檔說,Stream類的實例方法(包括Stream.Write)不保證是線程安全的,但它是什麼意思?如果一個線程試圖在Stream對象上調用Stream.Write之前,其他線程沒有從同一個對象上的同一方法返回,會發生什麼?會拋出一個異常,或者這個對象會根據線程的順序排列要發送的數據嗎?有人說沒有鎖定機制就可以打電話。有人可以澄清這一點嗎?Stream.Write方法的線程安全
4
A
回答
3
這意味着您不應該在同一時間從不同線程同時在同一個Stream實例上調用諸如Read和Write之類的實例方法。你會得到意想不到的行爲。在某些情況下,可能會拋出異常,在其他情況下,您的數據可能會損壞,而其他數據甚至可能會工作(如果您足夠幸運)。
如果您打算從多個線程使用它們,您需要始終使用適當的鎖定機制來同步對此類共享資源的訪問。
0
寫是抽象方法,這意味着該方法的行爲在Stream的子類中定義。 Stream的一些子類可以提供線程安全的Write方法,而另一些則不能。所以你不能說Stream如何在不同的線程中同時調用它的Write方法,除非你知道你正在處理什麼特定的Thread子類。
因此,您應該在使用Stream對象時使用鎖定,因爲MSDN表示Stream的方法不能保證是線程安全的,因此可能會有Streams在併發調用時可能會中斷。
但是,如果您明確使用特定的Stream的子類,並且您知道它是線程安全的,則不需要鎖定。
相關問題
- 1. Stream.Write是線程安全的嗎?
- 2. 線程安全的方法
- 3. Java方法線程安全
- 4. 線程安全方法?
- 5. QTimer線程安全的方法'isActive()'?
- 6. 線程安全的Dispose方法?
- 7. 靜態方法的線程安全
- 8. IntentService的onStartCommand(..)方法線程安全嗎?
- 9. 是靜態方法線程安全的
- 10. 線程安全的IQueryable擴展方法
- 11. 線程安全的方法setlocale()
- 12. Java:我的方法線程安全嗎?
- 13. 線程安全的UIKit方法
- 14. Java - 靜態方法的線程安全
- 15. 靜態方法和線程安全
- 16. 線程安全方法和堆棧
- 17. Ruby類方法是否線程安全?
- 18. 方法參數線程安全嗎?
- 19. Java靜態方法和線程安全
- 20. 是靜態方法線程安全
- 21. 靜態方法和線程安全
- 22. 線程安全類和方法參數
- 23. IEnumerable Linq方法是否線程安全?
- 24. 使android活動方法線程安全
- 25. TrackingParticipant.Track方法線程安全>
- 26. 類方法和線程安全(NSJSONSerialization)
- 27. 此方法線程安全嗎?
- 28. 此方法線程安全嗎?
- 29. Spring服務方法線程安全
- 30. 線程安全和方法參數
我們是否可以將其推廣到所有實例方法,以至於如果我們將對對象的非靜態方法進行多線程調用,或僅對共享資源(如網絡流或文件訪問)使用鎖定,我們必須使用鎖定?能夠從嘗試和經歷過這些事情的人那裏得到答案是很好的(可以肯定),因爲我也知道最好始終使用鎖定機制。謝謝 –
@Alp:可以創建一個類,使其在內部完全同步,因此是線程安全的。對於這樣的課程,不,您不需要使用外部鎖定。對於大多數使用情況來說,儘管外部實現鎖定要簡單得多,並且在大多數情況下需要正確的操作(例如,爲了確保原子性,在讀取和寫入之間鎖定一個「List」元素)。 'Read' /'Write'也可能在內部同步,但不能保證讀/寫所有給定的數據,因此整個操作仍然需要外部鎖定。 –
@Alp Hancioglu,不,我們不能一概而論。這就是爲什麼所有.NET Framework方法都有文檔記錄,並且通常應明確說明它們是否設計爲線程安全的原因。 –