我在類中使用靜態ArrayList來存儲有關不可更新數據庫字段的信息。我打算在構造函數中初始化它(init方法調用由構造函數中的鎖保護)。之後,多線程檢查arraylist是否包含一個字段。我是否必須以任何方式控制此讀取訪問?例如通過調用ArrayList.Synchronized。C#:如果多個線程只讀取它,我必須使ArrayList同步
回答
沒有(和你不應該需要創建它要麼只要你在static
構造做,which has an implicit multithread lock的時候 - 如果你在一個位置,這樣做不是,你可能會想要鎖定)。如果您最終需要訪問R/W訪問權限,則可以使用ReaderWriterLockSlim來控制訪問權限。
「...你創建它時不需要......」 - 不正確,如果創建它涉及多個機器語言指令週期,並且可能從多個線程中選中,那麼你需要將訪問同步到它。這是規範的只讀單例困境 - – 2009-11-30 14:35:39
@Charles:好點,已經打包了一下(通過說,必須在一個靜態構造函數中) – 2009-11-30 14:39:09
@Ruben,righto,static ctor是消除問題的方法。 ..刪除我的DV ... – 2009-11-30 15:12:00
不,只要你正在閱讀,你就可以擁有它。
非常感謝您的快速回答!認爲這裏的關鍵字是否定的,否則我沒有完全得到答案。由於應用程序對時間要求非常嚴格,因此我不必控制訪問權限。 – 2009-11-30 14:01:54
否。只有在您要更改狀態的有狀態對象時才需要同步。
不,但可以考慮將其封裝在ReadOnlyCollection
以確保沒有線程可以修改它。
編輯:但是,要做到這一點,你需要使清單List<T>
,而不是ArrayList
。
對於您的List的初始創建,您可以考慮使用靜態構造函數。這隻會在第一次引用該類型時調用一次。
- 1. 爲什麼我必須同步線程的ArrayList?
- 2. ArrayList,線程和同步 - 如何準確同步多個線程
- 3. 我必須使用多少個線程
- 4. C#只讀列表線程同步
- 5. 對象只被多個線程讀取,是否需要同步
- 6. epoll:我必須使用多線程
- 7. 如何以及在多線程C++中必須同步哪些數據
- 8. 我必須在由流讀取的列表上同步嗎?
- 9. 如果我在不同的線程上同步運行,它會使它每個總線的異步?
- 10. C++多線程同步
- 11. 通過兩個線程同步ArrayList
- 12. 只使用多線程讀取一行
- 13. 同步多個線程
- 14. 多線程,線程同步
- 15. 如果我想使用Platform.Sub.map,我必須導入它嗎?
- 16. 我是否需要同步CopyOnWriteArrayList中的項目,如果它們由不同的線程更新和讀取?
- 17. 如何同步多線程
- 18. C#線程同步
- 19. 線程同步:C
- 20. 線程同步c#
- 21. c#線程同步
- 22. c#線程同步
- 23. C++:線程同步
- 24. 多線程同步
- 25. 使用多線程讀取文件時的同步和異步操作
- 26. 如果我有1個線程寫入和1個線程讀取int32,它是線程安全的嗎?
- 27. 使用PHP Pthread同時讀取多個CSV文件(多線程)
- 28. 如何在後臺線程上讀取核心數據,同步在主線程上讀取結果?
- 29. 讀取多個線程
- 30. 同時爲多個用戶同步ArrayList
MSDN是你的朋友:「一個ArrayList可以同時支持多個閱讀器,只要該集合沒有被修改。」 – RickNZ 2009-12-01 10:31:00