.NET中的线程安全集合

rip*_*234 66 .net c# collections multithreading

当需要线程安全集合(例如Set)时,现在的标准是什么.我自己同步它,还是有固有的线程安全集合?

dtb*_*dtb 99

.NET 4.0 Framework在System.Collections.Concurrent命名空间中引入了几个线程安全的集合:

ConcurrentBag <T>
      表示线程安全,无序的对象集合.

ConcurrentDictionary <TKey,TValue>
    表示可由多个线程同时访问的键值对的线程安全集合.

ConcurrentQueue <T>
    表示线程安全的先进先出(FIFO)集合.

ConcurrentStack <T>
    表示线程安全的后进先出(LIFO)集合.


默认情况下,.NET Framework中的其他集合不是线程安全的,需要为每个操作锁定:

lock (mySet)
{
    mySet.Add("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

  • 在创建线程安全集合时,您可能更喜欢使用ReaderWriterLockSlim. (4认同)

kem*_*002 18

Pre .net 4.0 .Net中的大多数集合都不是线程安全的.你必须自己做一些工作来处理同步:http://msdn.microsoft.com/en-us/library/573ths2x.aspx

文章引用:

可以使用以下任何方法使集合类成为线程安全的:

使用Synchronized方法创建一个线程安全的包装器,并通过该包装器专门访问该集合.

如果类没有Synchronized方法,则从类派生并使用SyncRoot属性实现Synchronized方法.

访问集合时,在SyncRoot属性上使用锁定机制(如C#中的lock语句(Visual Basic中的SyncLock)).

同步根属性
锁定语句

Object thisLock = new Object();
......
lock (thisLock)
{
    // Critical code section
}
Run Code Online (Sandbox Code Playgroud)

在.net 4.0中,引入了System.Collections.Concurrent命名空间

阻断收集
并发包
并发队列
并发字典
Ordable分区程序
分区程序
分区程序Ť

  • 您锁定的对象应该是一个实例变量,否则它没有意义,因为您始终锁定新的引用. (4认同)
  • 那是真实的。这只是 MSDN 页面上有关如何使用锁定代码的示例。 (2认同)