【问题标题】:Is List<T>().Count thread-safe? [duplicate]List<T>().Count 是线程安全的吗? [复制]
【发布时间】:2014-08-04 02:09:45
【问题描述】:

有谁知道我是否需要一个锁来获取列表中的项目数?

代码行:

System.Web.HttpContext.Current.Application["Name"] as List&lt;Object&gt;

在列表中添加或删除对象时,我已经在进行锁定。

【问题讨论】:

标签: c# multithreading list thread-safety


【解决方案1】:

这真的取决于你所说的“线程安全”是什么意思。

例如,您在特定时间点阅读Count 是否重要?例如在插入/删除之后立即,如果是这样,那么不,没有锁检查它是不安全的。

假设您只是尝试提取一个整数值,最坏的情况是在您提取它之后值会发生变化(这可能对您来说很重要,也可能不重要)。我想这归结为数据“陈旧”对您的应用程序的重要性,而这只有您作为开发人员可以决定。

【讨论】:

  • List&lt;T&gt; 在这种情况下甚至可以随意抛出异常,因为您不能同时读取和写入集合。当前的实现没有这样做,但不能保证获得一个陈旧的值。
【解决方案2】:

根据http://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspxList&lt;T&gt; 不是线程安全的:

这种类型的公共静态(在 Visual Basic 中为共享)成员是线程安全的。不保证任何实例成员都是线程安全的。

对 List 执行多次读取操作是安全的,但如果在读取时修改集合,则可能会出现问题。为确保线程安全,请在读取或写入操作期间锁定集合。 要使一个集合能够被多个线程访问以进行读写,您必须实现自己的同步。对于具有内置同步的集合,请参阅 System.Collections.Concurrent 命名空间中的类。有关固有的线程安全替代方案,请参阅 ImmutableList 类。

因为.Count是实例成员,按照上面的说法,它不是线程安全的。

【讨论】:

  • 根本没有解决问题
  • 他们知道这一点,他们对添加和删除有锁定。
  • 您也可以关闭投票这个问题,因为它至少有两个符合条件的骗子,并且您已经获得了所需的声誉......
  • 它确实解决了这个问题,因为它引用了文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多