2009-11-30 43 views
1

我在類中使用靜態ArrayList來存儲有關不可更新數據庫字段的信息。我打算在構造函數中初始化它(init方法調用由構造函數中的鎖保護)。之後,多線程檢查arraylist是否包含一個字段。我是否必須以任何方式控制此讀取訪問?例如通過調用ArrayList.Synchronized。C#:如果多個線程只讀取它,我必須使ArrayList同步

+1

MSDN是你的朋友:「一個ArrayList可以同時支持多個閱讀器,只要該集合沒有被修改。」 – RickNZ 2009-12-01 10:31:00

回答

2

沒有(和你不應該需要創建它要麼只要你在static構造做,which has an implicit multithread lock的時候 - 如果你在一個位置,這樣做不是,你可能會想要鎖定)。如果您最終需要訪問R/W訪問權限,則可以使用ReaderWriterLockSlim來控制訪問權限。

+1

「...你創建它時不需要......」 - 不正確,如果創建它涉及多個機器語言指令週期,並且可能從多個線程中選中,那麼你需要將訪問同步到它。這是規範的只讀單例困境 - – 2009-11-30 14:35:39

+0

@Charles:好點,已經打包了一下(通過說,必須在一個靜態構造函數中) – 2009-11-30 14:39:09

+0

@Ruben,righto,static ctor是消除問題的方法。 ..刪除我的DV ... – 2009-11-30 15:12:00

3

不,只要你正在閱讀,你就可以擁有它。

+0

非常感謝您的快速回答!認爲這裏的關鍵字是否定的,否則我沒有完全得到答案。由於應用程序對時間要求非常嚴格,因此我不必控制訪問權限。 – 2009-11-30 14:01:54

3

否。只有在您要更改狀態的有狀態對象時才需要同步。

1

不,但可以考慮將其封裝在ReadOnlyCollection以確保沒有線程可以修改它。

編輯:但是,要做到這一點,你需要使清單List<T>,而不是ArrayList

0

對於您的List的初始創建,您可以考慮使用靜態構造函數。這隻會在第一次引用該類型時調用一次。