2014-02-16 71 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会更快(在运行时)。