【问题标题】:Is ICollection<T>.Add ThreadSafe?ICollection<T>.Add ThreadSafe 吗?
【发布时间】:2013-09-22 22:39:36
【问题描述】:

我有一个BindingList,我将在两个不同的线程中填充...是否使用BindingList.Add() 方法ThreadSafe?

【问题讨论】:

    标签: c# multithreading list collections thread-safety


    【解决方案1】:

    不,Collection&lt;T&gt;.Add 不是线程安全的。

    MSDN 通常在类文章中而不是在单个方法中介绍线程安全。 IE。为Collection

    一个集合可以同时支持多个读取器,只要集合没有被修改。即便如此,通过集合进行枚举本质上不是线程安全的过程。为了保证枚举过程中的线程安全,可以在整个枚举过程中锁定集合。要允许多个线程访问集合以进行读写,您必须实现自己的同步

    请注意,您不能说接口的方法是否是线程安全的,因为接口没有定义任何线程安全要求,它只指定方法签名。您需要检查每个单独的实现是否对线程安全有任何特定保证。

    【讨论】:

      【解决方案2】:

      不,BindingList.Add 方法不是线程安全的。

      在该类的文档中,您可以在线程安全下找到这个标准短语:

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

      这意味着该类没有任何线程安全考虑。

      您需要同步对BindingList 实例的所有访问。您可以将其与 lock 关键字一起使用:

      lock(_sync) {
        myBindingList.Add(something);
      }
      

      变量_sync 所引用的对象被用作锁的标识符,因此访问该列表的所有代码都必须对锁使用相同的引用。通常使用对象实例:

      private object _sync = new Object();
      

      【讨论】:

        【解决方案3】:

        System.Collections.Concurrent 命名空间提供了几个线程安全的集合类,当多个线程同时访问集合时,应使用这些类代替 System.Collections 和 System.Collections.Generic 命名空间中的相应类型。

        http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-03
          • 2010-12-05
          • 2010-12-05
          • 1970-01-01
          • 2012-05-22
          • 1970-01-01
          • 1970-01-01
          • 2012-04-28
          相关资源
          最近更新 更多