【问题标题】:Is it thread safe to get an element by index from List从List中按索引获取元素是否线程安全
【发布时间】:2014-02-23 14:59:25
【问题描述】:

从List中按索引获取元素是线程安全的吗?

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

【问题讨论】:

  • 这基本上取决于列表的实现。 ArrayList 不是线程安全的,CopyOnWriteArrayList 是...
  • 如果你只从列表中获取元素,那么它就可以了。如果您也在更改列表(设置、添加、删除),那么您应该锁定集合
  • 这取决于你在做什么。并发 reads 没问题。

标签: c#


【解决方案1】:

它绝对是线程安全的... ...只要您可以确保列表没有更改。即使添加项目也会使您陷入“未定义”的境地(尽管它可能会起作用)。

所以,只读 - 是的。读取 + 操作:没有。

注意:只要 list[5] 例如是同一个对象,就可以更改 lsit 中的项目。列表不在乎。并不是说它会起作用 - 因为取决于您在此处更改的内容,这将是您与列表中对象的合同。对于整数,您显然不应该更新它们。

【讨论】:

    【解决方案2】:

    这取决于你想做什么。

    阅读 - 完全安全。

    写入/编辑 - 不太安全

    很少有分类为Concurrent Collections 的集合是开箱即用的线程安全的。

    但是,同步现有的List&lt;T&gt; 比使用并发集合更快(在运行时)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2010-12-06
      相关资源
      最近更新 更多