2014-02-16 68 views
1

通過List索引獲取元素是否線程安全?從列表中獲取索引元素是否線程安全?

var list = new List<int>(); 
... 
var a = list[i]; //executed from multiple threads. Should this be protected? 
+2

基本上取決於列表的實現。 'ArrayList'不是線程安全的,'CopyOnWriteArrayList'是... –

+1

如果你只是從列表中獲取元素,那麼它就OK。如果你還在更改列表(設置,添加,刪除),那麼你應該鎖定收集 –

+1

這取決於你在做什麼。併發_reads_很好。 – SLaks

回答

5

它絕對是線程安全的... ... 只要你能確保該列表不改變。即使添加項目,也會讓你進入「未定義的區域」(儘管取決於具體實現,它可能會正常工作)。

所以,只讀 - 是的。閱讀+操作:不。

注意:只要列表[5]例如是同一個對象,就可以在lsit中更改項目。該列表不關心。不要說它會起作用 - 因爲取決於你會在這裏改變什麼,這將是你與列表中的對象的合同。對於整數你顯然不應該更新它們。

1

這取決於您希望執行的操作。

閱讀 - 完全安全。

寫/編輯 - 不那麼安全

有歸類爲Concurrent Collections幾集這是線程安全的開箱即用的。

但是,同步現有的List<T>而不是使用Concurrent Collection會更快(在運行時)。